• Bug#1069846: dpkg: dpkg-deb fails to build package w/ incomplete change

    From Guillem Jover@1:229/2 to Rainer Weikusat on Thu Apr 25 23:30:02 2024
    XPost: linux.debian.bugs.dist
    From: [email protected]

    Hi!

    On Thu, 2024-04-25 at 18:42:50 +0100, Rainer Weikusat wrote:
    Package: dpkg
    Version: 1.21.22
    Severity: minor
    Tags: patch
    X-Debbugs-Cc: [email protected]

    The /usr/share/dpkg/pkg-info.mk file invokes dpkg-parsechangelog to
    set the SOURCE_DATE_EPOCH environment variable to the date of the
    last changelog entry for the package being built. If this changelog
    entry hasn't yet been finalized with a date, eg, if it looks like this (actual example):

    apache2 (2.4.59-ca001-1-deb12u2) unstable; urgency=medium

    * updated to Debian 12 sources

    --

    SOURCE_DATE_EPOCH is set to an empty string. This causes the
    parse_timestamp routine in build.c to fail and print the (rather
    confusing) error message:

    unable to parse timestamp '': Success

    (Success being printed because errno isn't set). Package generation then fails because dpkg-deb afterwards terminates with an exit code of 2.

    Building such packages may not be a supported feature but I've been
    using it for dev builds of packages for about 20 years (and plan to
    continue doing so). The included patch avoids the issue by ignoring the
    value of SOURCE_DATA_EPOCH when it's empty.

    Thanks for the report and the patch! I've queued the attached patch,
    in addition to another one improving the error messages to avoid the
    above confusing output, and I'll also add yet another one refactoring
    the functions (which I had pending on doing).

    Thanks,
    Guillem

    From 93e7b2268fabc35d754ffe6389b5172b5917eb8c Mon Sep 17 00:00:00 2001
    From: Guillem Jover <[email protected]>
    Date: Thu, 25 Apr 2024 22:44:19 +0200
    Subject: [PATCH] src: Check whether SOURCE_DATE_EPOCH is set before parsing it

    The dpkg-deb and dpkg-split program try to parse this environment
    variable to use it for their timestamps inside files to generate
    reproducible artifacts. But when the environment variable is set
    but empty then the parsing function fails with a confusing error
    message.

    This is an issue when building a package directly via debian/rules
    that uses the pkg-info.mk fragment file, because that one tries to
    set the SOURCE_DATE_EPOCH and can end up setting it to an empty value
    if the changelog contains an unfinished trailer. This is not an issue
    when using dpkg-buildpackage, though because the code there will
    fallback to use the current time if it there is no value from the
    changelog.

    Closes: #1069846
    Based-on-patch-by: Rainer Weikusat <[email protected]>
    ---
    src/deb/build.c | 2 +-
    src/split/split.c | 2 +-
    2 files changed, 2 insertions(+), 2 deletions(-)

    diff --git a/src/deb/build.c b/src/deb/build.c
    index 1f0c050ee..16f2bafdf 100644
    --- a/src/deb/build.c
    +++ b/src/deb/build.c
    @@ -597,7 +597,7 @@ do_build(const char *const *argv)
    m_output(stdout, _("<standard output>"));

    timestamp_str = getenv("SOURCE_DATE_EPOCH");
    - if (timestamp_str)
    + if (str_is_set(timestamp_str))
    timestamp = parse_timestamp(timestamp_str);
    else
    timestamp = time(NULL);
    diff --git a/src/split/split.c b/src/split/split.c
    index 771de626c..04d41b281 100644
    --- a/src/split/split.c
    +++ b/src/split/split.c
    @@ -162,7 +162,7 @@ mksplit(const char *file_src, const char *prefix, off_t maxpartsize,
    version = versiondescribe(&pkg->available.version, vdew_nonambig);

    timestamp_str = getenv("SOURCE_DATE_EPOCH");
    - if (timestamp_str)
    + if (str_is_set(timestamp_str))
    timestamp = parse_timestamp(timestamp_str);
    else
    timestamp = time(NUL