mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
Current code uses atoi to parse the generator Int type and
atoll to parse the generator Int64 type. The problem with the
ato* functions is that they don't cope with errors very well,
and they cannot parse numbers that begin with 0.. or 0x..
for octal and hexadecimal respectively.
This replaces the atoi call with a call to Gnulib xstrtol
and the atoll call with a call to Gnulib xstrtoll.
The generated code looks like this for all Int arguments:
{
strtol_error xerr;
long r;
xerr = xstrtol (argv[0], NULL, 0, &r, "");
if (xerr != LONGINT_OK) {
fprintf (stderr,
_("%s: %s: invalid integer parameter (%s returned %d)\n"),
cmd, "memsize", "xstrtol", xerr);
return -1;
}
/* The Int type in the generator is a signed 31 bit int. */
if (r < (-(2LL<<30)) || r > ((2LL<<30)-1)) {
fprintf (stderr, _("%s: %s: integer out of range\n"), cmd, "memsize");
return -1;
}
/* The check above should ensure this assignment does not overflow. */
memsize = r;
}
and like this for all Int64 arguments (note we don't need the
range check for these):
{
strtol_error xerr;
long long r;
xerr = xstrtoll (argv[1], NULL, 0, &r, "");
if (xerr != LONGINT_OK) {
fprintf (stderr,
_("%s: %s: invalid integer parameter (%s returned %d)\n"),
cmd, "size", "xstrtoll", xerr);
return -1;
}
size = r;
}
Note this also fixes an unrelated bug in guestfish handling of
RBufferOut. We were using 'fwrite' without checking the return
value, and this could have caused silent failures, eg. in the case
where there was not enough disk space to store the resulting file,
or even if the program was interrupted (but continued) during the
write.
Replace this with Gnulib 'full-write', and check the return value
and report errors.
95 lines
1.9 KiB
Bash
Executable File
95 lines
1.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
usage() {
|
|
echo >&2 "\
|
|
Usage: $0 [OPTION]...
|
|
Bootstrap this package from the checked-out sources.
|
|
"
|
|
}
|
|
|
|
for option
|
|
do
|
|
case $option in
|
|
--help)
|
|
usage
|
|
exit;;
|
|
*)
|
|
echo >&2 "$0: $option: unknown option"
|
|
exit 1;;
|
|
esac
|
|
done
|
|
|
|
# Get gnulib files.
|
|
|
|
echo "$0: getting gnulib files..."
|
|
git submodule init || exit $?
|
|
git submodule update || exit $?
|
|
GNULIB_SRCDIR=.gnulib
|
|
|
|
ls po/*.po 2>/dev/null | sed 's|.*/||; s|\.po$||' > po/LINGUAS
|
|
|
|
# Run autopoint, to get po/Makevars.template:
|
|
# Also, released autopoint has the tendency to install macros that have
|
|
# been obsoleted in current gnulib, so run this before gnulib-tool.
|
|
autopoint --force
|
|
|
|
# Autoreconf runs aclocal before libtoolize, which causes spurious
|
|
# warnings if the initial aclocal is confused by the libtoolized
|
|
# (or worse out-of-date) macro directory.
|
|
libtoolize --copy --install
|
|
|
|
# Create gettext configuration.
|
|
echo "$0: Creating po/Makevars from po/Makevars.template ..."
|
|
rm -f po/Makevars
|
|
sed '
|
|
/^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
|
|
/^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
|
|
/^XGETTEXT_OPTIONS *=/{
|
|
s/$/ \\/
|
|
a\
|
|
'"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
|
|
}
|
|
' po/Makevars.template >po/Makevars
|
|
|
|
gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
|
|
<$gnulib_tool || exit
|
|
|
|
(cd daemon && mkdir -p tests lib && ../$gnulib_tool --update)
|
|
|
|
modules='
|
|
arpa_inet
|
|
c-ctype
|
|
closeout
|
|
full-write
|
|
gitlog-to-changelog
|
|
gnu-make
|
|
gnumakefile
|
|
hash
|
|
hash-pjw
|
|
ignore-value
|
|
lock
|
|
maintainer-makefile
|
|
manywarnings
|
|
netinet_in
|
|
progname
|
|
strchrnul
|
|
strerror
|
|
strndup
|
|
vasprintf
|
|
vc-list-files
|
|
warnings
|
|
xstrtol
|
|
xstrtoll
|
|
'
|
|
|
|
$gnulib_tool \
|
|
--avoid=dummy \
|
|
--with-tests \
|
|
--m4-base=m4 \
|
|
--source-base=gnulib/lib \
|
|
--tests-base=gnulib/tests \
|
|
--import $modules
|
|
|
|
# Disable autopoint and libtoolize, since they were already done above.
|
|
AUTOPOINT=true LIBTOOLIZE=true autoreconf --verbose --install
|