sysroot: Handle `/ostree/deploy` having epoch 0
authorColin Walters <walters@verbum.org>
Wed, 15 May 2024 13:41:35 +0000 (09:41 -0400)
committerColin Walters <walters@verbum.org>
Wed, 15 May 2024 13:59:50 +0000 (09:59 -0400)
Ironically we break if the timestamp there is zero.

Closes: https://github.com/ostreedev/ostree/issues/3022
Signed-off-by: Colin Walters <walters@verbum.org>
src/libostree/ostree-sysroot-private.h
src/libostree/ostree-sysroot.c
tests/admin-test.sh

index 41513acc30804946090e429ef0cd06b9d856afce..3dd6939b4c8518d68a39befce25d7cc31c68de7f 100644 (file)
@@ -85,6 +85,8 @@ struct OstreeSysroot
   OstreeDeployment *booted_deployment;
   OstreeDeployment *staged_deployment;
   GVariant *staged_deployment_data;
+  // True if loaded_ts is initialized
+  gboolean has_loaded;
   struct timespec loaded_ts;
 
   /* Only access through ostree_sysroot_[_get]repo() */
index 78741b75262fae4bed60c195f3eb731997f5bb5e..af9e07c1ab5acdff7d2f7b4ce6ac2392f4d80bd3 100644 (file)
@@ -1261,7 +1261,7 @@ ostree_sysroot_load_if_changed (OstreeSysroot *self, gboolean *out_changed,
   if (!glnx_fstatat (self->sysroot_fd, "ostree/deploy", &stbuf, 0, error))
     return FALSE;
 
-  if (self->loaded_ts.tv_sec == stbuf.st_mtim.tv_sec
+  if (self->has_loaded && self->loaded_ts.tv_sec == stbuf.st_mtim.tv_sec
       && self->loaded_ts.tv_nsec == stbuf.st_mtim.tv_nsec)
     {
       if (out_changed)
@@ -1280,6 +1280,7 @@ ostree_sysroot_load_if_changed (OstreeSysroot *self, gboolean *out_changed,
     return FALSE;
 
   self->loaded_ts = stbuf.st_mtim;
+  self->has_loaded = TRUE;
 
   if (out_changed)
     *out_changed = TRUE;
index e655c710dfe90bc084d5a620fed82ff6b9f9c9d0..2adae9df5c722734346763907ff5fba3ac57430f 100644 (file)
@@ -60,7 +60,9 @@ orig_mtime=$(stat -c '%.Y' sysroot/ostree/deploy)
 ${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull-local --remote=testos testos-repo testos/buildmain/x86_64-runtime
 rev=$(${CMD_PREFIX} ostree --repo=sysroot/ostree/repo rev-parse testos/buildmain/x86_64-runtime)
 export rev
-# This initial deployment gets kicked off with some kernel arguments
+# This initial deployment gets kicked off with some kernel arguments.  We also set the initial
+# timestamp of the deploy directory to the epoch as a regression test.
+touch -d @0 sysroot/ostree/deploy
 ${CMD_PREFIX} ostree admin deploy --karg=root=LABEL=MOO --karg=quiet --os=testos testos:testos/buildmain/x86_64-runtime
 new_mtime=$(stat -c '%.Y' sysroot/ostree/deploy)
 assert_not_streq "${orig_mtime}" "${new_mtime}"