chiark / gitweb /
prefork-interp: include more stuff in hash
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Aug 2022 13:57:48 +0000 (14:57 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Aug 2022 20:21:10 +0000 (21:21 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
cprogs/prefork-interp.c
cprogs/prefork.h

index 47ad3616a5e46b7bb7c7e546eb96deb9b31b8ae7..8fcb5dcde70da89f66dfd1fc943839f2af267c38 100644 (file)
 */
 
 #include <arpa/inet.h>
+#include <sys/utsname.h>
 
 #include <uv.h>
 
@@ -404,9 +405,29 @@ const struct cmdinfo cmdinfos[]= {
   { 0 }
 };
 
+static void ident_add_stat(const char *path) {
+  struct stat stab;
+  int r = stat(path, &stab);
+  if (r) diee("failed to stat %s", path);
+
+  IDENT_ADD_OBJ(stab.st_dev);
+  IDENT_ADD_OBJ(stab.st_ino);
+}
+
 void ident_addinit(void) {
-  char ident_magic[1] = { 0 };
-  sha256_update(&identsc, sizeof(ident_magic), ident_magic);
+  char magic = 1;
+
+  IDENT_ADD_OBJ(magic);
+
+  struct utsname uts = { };
+  size_t utslen = sizeof(uts);
+  int r = uname(&uts);
+  if (r) diee("uname failed!");
+  IDENT_ADD_OBJ(utslen);
+  IDENT_ADD_OBJ(uts);
+
+  ident_add_stat(".");
+  ident_add_stat("/");
 }
 
 static void propagate_exit_status(int status, const char *what) {
index 66ed5fc8f223043e43b9f0fed6564df0e0c8e803..cfbd715fe24355933e0c60c97530430dfcae9e31 100644 (file)
@@ -88,4 +88,7 @@ void off_ident_addenv(const struct cmdinfo *ci, const char *name);
 void ident_addinit(void);
 bool stabs_same_inode(struct stat *a, struct stat *b);
 
+#define IDENT_ADD_OBJ(obj) \
+  sha256_update(&identsc, sizeof((obj)), (void*)&obj);
+
 #endif /*PREFORK_H*/