Bug 245767

Summary: ports-mgmt/pkg: 1.14.2 critical SQLITE error is ignored
Product: Ports & Packages Reporter: Maxim Sobolev <sobomax>
Component: Individual Port(s)Assignee: freebsd-pkg (Nobody) <pkg>
Status: New ---    
Severity: Affects Many People CC: bapt, lwhsu
Priority: ---    
Version: Latest   
Hardware: Any   
OS: Any   
Attachments:
Description Flags
Patch to fix the issue. none

Description Maxim Sobolev freebsd_committer 2020-04-20 15:44:29 UTC
Created attachment 213606 [details]
Patch to fix the issue.

One of our build envs has run out of disk space, and we've noticed that error is not raised by the pkg failure, resulting in quite a mess.

[2020-04-18T04:49:42.516Z] + rm /tmp/rrd_create.sh /tmp/rrd.conf
[2020-04-18T04:49:42.516Z] + rm -f /tmp/sh.qPrEwG
[2020-04-18T04:49:42.770Z] pkg-static: sqlite error while executing COMMIT TRANSACTION
  in file pkgdb.c:1292: database or disk is full
[2020-04-18T04:49:43.046Z] ===>  Building package for ssp-5.3.20190821165853_3
[2020-04-18T04:50:30.208Z] ===>  Cleaning for ssp-5.3.20190821165853_3

Further investigation shows the following call stack:

#0  0x000000000046f66f in run_transaction (sqlite=0x8017fc008, query=0x8ebb87 "COMMIT TRANSACTION", savepoint=0x0) at pkgdb.c:1298
#1  0x000000000046f732 in pkgdb_transaction_commit_sqlite (sqlite=0x8017fc008, savepoint=0x0) at pkgdb.c:1320
#2  0x000000000047200c in pkgdb_register_finale (db=0x8010a66e0, retcode=0, savepoint=0x0) at pkgdb.c:2383
#3  0x0000000000469d45 in pkg_add_port (db=0x8010a66e0, pkg=0x801079000, input_path=0x7fffffffe7ef "/tmp/media/ssp_port/work/stage", reloc=0x0, testing=false) at pkg_ports.c:1365
#4  0x00000000004167e6 in exec_register (argc=7, argv=0x7fffffffe428) at register.c:195
#5  0x000000000041145c in main (argc=7, argv=0x7fffffffe428) at main.c:886

The culprit seems in the pkg_add_port(), the return value of pkgdb_register_finale() is not checked, resulting in error condition being essentially lost.

(gdb) up
#3  0x0000000000469d45 in pkg_add_port (db=0x8010a66e0, pkg=0x801079000, input_path=0x7fffffffe7ef "/tmp/media/ssp_port/work/stage", reloc=0x0, testing=false) at pkg_ports.c:1365
1365            pkgdb_register_finale(db, rc, NULL);
(gdb) l
1360                            utstring_free(message);
1361                    }
1362            }
1363
1364    cleanup:
1365            pkgdb_register_finale(db, rc, NULL);
1366
1367            return (rc);
1368    }
(gdb) print rc
$2 = 0