It is beacuse the $rec_name is undefined while calling ip_in_use at save_record.cgi
Change it to:

if (($new || $oldvalue ne $value) && &ip_in_use($conf, $value,
        $rec_name, $type, undef, $access{'no_multiple'}) && defined($rec_name)) { 
    &terror('edit_edupip', $value);
}

It should ignore when it is undefined.

Additionally, you can copy the error subrotine from web-lib-funcs.pl to b9ddns-lib.pl as terror.

Something like below after "do 'records-lib.pl';":

sub terror
{
$main::no_miniserv_userdb = 1;
my $msg = join("", @);
$msg =~ s/<[^>]*>//g;
if (!$main::error_must_die) {
print STDERR "Error: ",$msg,"\n";
}
&load_theme_library();
if ($main::error_must_die) {
if ($gconfig{'error_stack'}) {
print STDERR "Error: ",$msg,"\n";
for(my $i=0; my @stack = caller($i); $i++) {
print STDERR "File: $stack[1] Line: $stack[2] ",
"Function: $stack[3]\n";
}
}
die @
;
}
elsif (!$ENV{'REQUEST_METHOD'}) {
# Show text-only error
print STDERR "$text{'error'}\n";
print STDERR "-----\n";
print STDERR ($main::whatfailed ? "$main::whatfailed : " : ""),
$msg,"\n";
print STDERR "-----\n";
if ($gconfig{'error_stack'}) {
# Show call stack
print STDERR $text{'error_stack'},"\n";
for(my $i=0; my @stack = caller($i); $i++) {
print STDERR &text('error_stackline',
$stack[1], $stack[2], $stack[3]),"\n";
}
}

    }

elsif (defined(&theme_error)) {
&theme_error(@);
}
else {
&header($text{'error'}, "");
print "


\n";
print "

",($main::whatfailed ? "$main::whatfailed : " : ""),
@
,"

\n";
if ($gconfig{'error_stack'}) {
# Show call stack
print "

$text{'error_stack'}

\n";
print "\n";
$text{'error_file'}$text{'error_line'}$text{'error_sub'}
$stack[1]$stack[2]$stack[3]
\n";
}
print "
\n";
if ($ENV{'HTTP_REFERER'} && $main::completed_referers_check) {
&footer("javascript:history.back()", $text{'error_previous'});
}
else {
&footer();
}
}
&unlock_all_files();
&cleanup_tempnames();
exit(1);
}