[Gptfdisk-general] problem when building vs popt master (7182e4618ad5a0186145fc2aa4a98c2229afdfa8,
Brought to you by:
srs5694
|
From: <bal...@un...> - 2022-04-15 16:07:50
|
hello
this is actually more an headsup than a bug report
I just run the build of gptfdisk-1.0.9 (on linux) vs popt master (as per
the subject) and got the following error from sgdisk at "make test":
----8<----
[...]
[0;34m**Testing sgdisk binary**[m
Problem opening for reading! Error is 2.
The specified file does not exist!
Warning! Unable to generate a proper UUID! Creating an improper one as a last
resort! Windows 7 may crash if you save this partition table!
Information: Creating fresh partition table; will override earlier problems!
Caution! Secondary header was placed beyond the disk's limits! Moving the
header, but other problems may occur!
Unable to open device '' for writing! Errno is 2! Aborting write!
[0;31m**FAILED**[m sgdisk return 4 when creating partition table
make[1]: *** [Makefile:160: test] Error 1
make[1]: Leaving directory '/home/balducci/tmp/install-us-d/gptfdisk-1.0.9.d/gptfdisk-1.0.9'
---->8----
Note that for gdisk all tests complete successfully
After some debugging, I seem to have clarified the situation.
sgdisk (but not gdisk) uses popt to parse command line opts.
In gptcl.cc the device filename is read from the command line as:
----8<----
device = (char*) poptGetArg(poptCon);
---->8----
Note that poptGetArg returns its own allocated memory, not a copy of
it:
----8<----
const char * poptGetArg(poptContext con)
{
const char * ret = NULL;
if (con && con->leftovers != NULL && con->nextLeftover < con->numLeftovers)
ret = con->leftovers[con->nextLeftover++];
return ret;
}
---->8----
Immediately after the poptGetArg call, gptcl.cc does:
----8<----
poptResetContext(poptCon);
---->8----
Now: in the latest commit to popt
(7182e4618ad5a0186145fc2aa4a98c2229afdfa8, revno: 740) the
poptResetContext function (in popt.c) *FREES* the leftovers (which it
didn't until 740):
----8<----
##> git diff a4afb898f7758160acda71d774c7d98d528da273 7182e4618ad5a0186145fc2aa4a98c2229afdfa8
diff --git a/src/popt.c b/src/popt.c
index 0521c8d..f3f26a3 100644
--- a/src/popt.c
+++ b/src/popt.c
@@ -216,6 +216,9 @@ void poptResetContext(poptContext con)
else
con->os->next = 0;
+ for (i = 0; i < con->numLeftovers; i++) {
+ con->leftovers[i] = _free(con->leftovers[i]);
+ }
con->numLeftovers = 0;
con->nextLeftover = 0;
con->restLeftover = 0;
@@ -1534,7 +1537,7 @@ poptContext poptFreeContext(poptContext con)
con->numExecs = 0;
for (i = 0; i < con->numLeftovers; i++) {
- con->leftovers[i] = _free(&con->leftovers[i]);
+ con->leftovers[i] = _free(con->leftovers[i]);
}
con->leftovers = _free(con->leftovers);
---->8----
The end result is that when sgdisk is linked vs latest popt (revno
740), the device variable in gptcl.cc does not point to valid memory
after "poptResetContext(poptCon);" and causes the error reported above.
Note that this problem didn't exist before popt-740
(7182e4618ad5a0186145fc2aa4a98c2229afdfa8) because for previous popt
revisions the leftovers were not freed in poptResetContext.
As a matter of fact, this fixes everything for me and the tests
complete successfully also for sgdisk:
----8<----
diff -c ./gptcl.cc.USE_STRDUP ./gptcl.cc
*** ./gptcl.cc.USE_STRDUP Fri Apr 15 16:33:50 2022
--- ./gptcl.cc Fri Apr 15 16:33:50 2022
***************
*** 155,161 ****
} // while
// Assume first non-option argument is the device filename....
! device = (char*) poptGetArg(poptCon);
poptResetContext(poptCon);
if (device != NULL) {
--- 155,161 ----
} // while
// Assume first non-option argument is the device filename....
! device = strdup((char*) poptGetArg(poptCon));
poptResetContext(poptCon);
if (device != NULL) {
---->8----
As I said, this is just to let you know the potential problem when
sgdisk is linked vs popt>=740
I thank you very much for your excellent work
ciao
-gabriele
|