Fossil SCM
Expand the /hash-collisions report to show hash prefix collisions on just check-ins in addition to overall hash collisions.
Commit
60af05741590fa9829b321641f4620aa87a0ba4d
Parent
af872dedcb968d3…
1 file changed
+29
-10
+29
-10
| --- src/name.c | ||
| +++ src/name.c | ||
| @@ -1068,29 +1068,26 @@ | ||
| 1068 | 1068 | |
| 1069 | 1069 | /* Maximum number of collision examples to remember */ |
| 1070 | 1070 | #define MAX_COLLIDE 25 |
| 1071 | 1071 | |
| 1072 | 1072 | /* |
| 1073 | -** WEBPAGE: hash-collisions | |
| 1074 | -** | |
| 1075 | -** Show the number of hash collisions for hash prefixes of various lengths. | |
| 1073 | +** Generate a report on the number of collisions in SHA1 hashes | |
| 1074 | +** generated by the SQL given in the argument. | |
| 1076 | 1075 | */ |
| 1077 | -void hash_collisions_webpage(void){ | |
| 1076 | +static void collision_report(const char *zSql){ | |
| 1078 | 1077 | int i, j, kk; |
| 1079 | 1078 | int nHash = 0; |
| 1080 | 1079 | Stmt q; |
| 1081 | 1080 | char zPrev[UUID_SIZE+1]; |
| 1082 | 1081 | struct { |
| 1083 | 1082 | int cnt; |
| 1084 | 1083 | char *azHit[MAX_COLLIDE]; |
| 1085 | 1084 | char z[UUID_SIZE+1]; |
| 1086 | 1085 | } aCollide[UUID_SIZE+1]; |
| 1087 | - login_check_credentials(); | |
| 1088 | - if( !g.perm.Read ){ login_needed(g.anon.Read); return; } | |
| 1089 | 1086 | memset(aCollide, 0, sizeof(aCollide)); |
| 1090 | 1087 | memset(zPrev, 0, sizeof(zPrev)); |
| 1091 | - db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1"); | |
| 1088 | + db_prepare(&q,"%s",zSql/*safe-for-%s*/); | |
| 1092 | 1089 | while( db_step(&q)==SQLITE_ROW ){ |
| 1093 | 1090 | const char *zUuid = db_column_text(&q,0); |
| 1094 | 1091 | int n = db_column_bytes(&q,0); |
| 1095 | 1092 | int i; |
| 1096 | 1093 | nHash++; |
| @@ -1103,13 +1100,10 @@ | ||
| 1103 | 1100 | if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1); |
| 1104 | 1101 | } |
| 1105 | 1102 | memcpy(zPrev, zUuid, n+1); |
| 1106 | 1103 | } |
| 1107 | 1104 | db_finalize(&q); |
| 1108 | - style_header("SHA1 Prefix Collisions"); | |
| 1109 | - style_submenu_element("Activity Reports", 0, "reports"); | |
| 1110 | - style_submenu_element("Stats", 0, "stat"); | |
| 1111 | 1105 | @ <table border=1><thead> |
| 1112 | 1106 | @ <tr><th>Length<th>Instances<th>First Instance</tr> |
| 1113 | 1107 | @ </thead><tbody> |
| 1114 | 1108 | for(i=1; i<=UUID_SIZE; i++){ |
| 1115 | 1109 | if( aCollide[i].cnt==0 ) continue; |
| @@ -1131,7 +1125,32 @@ | ||
| 1131 | 1125 | char *zId = aCollide[i].azHit[j]; |
| 1132 | 1126 | if( zId==0 ) continue; |
| 1133 | 1127 | @ %z(href("%R/whatis/%s",zId))%h(zId)</a> |
| 1134 | 1128 | } |
| 1135 | 1129 | } |
| 1130 | + for(i=4; i<ArraySize(aCollide); i++){ | |
| 1131 | + for(j=0; j<aCollide[i].cnt && j<MAX_COLLIDE; j++){ | |
| 1132 | + fossil_free(aCollide[i].azHit[j]); | |
| 1133 | + } | |
| 1134 | + } | |
| 1135 | +} | |
| 1136 | + | |
| 1137 | +/* | |
| 1138 | +** WEBPAGE: hash-collisions | |
| 1139 | +** | |
| 1140 | +** Show the number of hash collisions for hash prefixes of various lengths. | |
| 1141 | +*/ | |
| 1142 | +void hash_collisions_webpage(void){ | |
| 1143 | + Stmt q; | |
| 1144 | + login_check_credentials(); | |
| 1145 | + if( !g.perm.Read ){ login_needed(g.anon.Read); return; } | |
| 1146 | + style_header("SHA1 Prefix Collisions"); | |
| 1147 | + style_submenu_element("Activity Reports", 0, "reports"); | |
| 1148 | + style_submenu_element("Stats", 0, "stat"); | |
| 1149 | + @ <h1>Hash Prefix Collisions on Check-ins</h1> | |
| 1150 | + collision_report("SELECT (SELECT uuid FROM blob WHERE rid=objid)" | |
| 1151 | + " FROM event WHERE event.type='ci'" | |
| 1152 | + " ORDER BY 1"); | |
| 1153 | + @ <h1>Hash Prefix Collisions on All Artifacts</h1> | |
| 1154 | + collision_report("SELECT uuid FROM blob ORDER BY 1"); | |
| 1136 | 1155 | style_footer(); |
| 1137 | 1156 | } |
| 1138 | 1157 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -1068,29 +1068,26 @@ | |
| 1068 | |
| 1069 | /* Maximum number of collision examples to remember */ |
| 1070 | #define MAX_COLLIDE 25 |
| 1071 | |
| 1072 | /* |
| 1073 | ** WEBPAGE: hash-collisions |
| 1074 | ** |
| 1075 | ** Show the number of hash collisions for hash prefixes of various lengths. |
| 1076 | */ |
| 1077 | void hash_collisions_webpage(void){ |
| 1078 | int i, j, kk; |
| 1079 | int nHash = 0; |
| 1080 | Stmt q; |
| 1081 | char zPrev[UUID_SIZE+1]; |
| 1082 | struct { |
| 1083 | int cnt; |
| 1084 | char *azHit[MAX_COLLIDE]; |
| 1085 | char z[UUID_SIZE+1]; |
| 1086 | } aCollide[UUID_SIZE+1]; |
| 1087 | login_check_credentials(); |
| 1088 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| 1089 | memset(aCollide, 0, sizeof(aCollide)); |
| 1090 | memset(zPrev, 0, sizeof(zPrev)); |
| 1091 | db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1"); |
| 1092 | while( db_step(&q)==SQLITE_ROW ){ |
| 1093 | const char *zUuid = db_column_text(&q,0); |
| 1094 | int n = db_column_bytes(&q,0); |
| 1095 | int i; |
| 1096 | nHash++; |
| @@ -1103,13 +1100,10 @@ | |
| 1103 | if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1); |
| 1104 | } |
| 1105 | memcpy(zPrev, zUuid, n+1); |
| 1106 | } |
| 1107 | db_finalize(&q); |
| 1108 | style_header("SHA1 Prefix Collisions"); |
| 1109 | style_submenu_element("Activity Reports", 0, "reports"); |
| 1110 | style_submenu_element("Stats", 0, "stat"); |
| 1111 | @ <table border=1><thead> |
| 1112 | @ <tr><th>Length<th>Instances<th>First Instance</tr> |
| 1113 | @ </thead><tbody> |
| 1114 | for(i=1; i<=UUID_SIZE; i++){ |
| 1115 | if( aCollide[i].cnt==0 ) continue; |
| @@ -1131,7 +1125,32 @@ | |
| 1131 | char *zId = aCollide[i].azHit[j]; |
| 1132 | if( zId==0 ) continue; |
| 1133 | @ %z(href("%R/whatis/%s",zId))%h(zId)</a> |
| 1134 | } |
| 1135 | } |
| 1136 | style_footer(); |
| 1137 | } |
| 1138 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -1068,29 +1068,26 @@ | |
| 1068 | |
| 1069 | /* Maximum number of collision examples to remember */ |
| 1070 | #define MAX_COLLIDE 25 |
| 1071 | |
| 1072 | /* |
| 1073 | ** Generate a report on the number of collisions in SHA1 hashes |
| 1074 | ** generated by the SQL given in the argument. |
| 1075 | */ |
| 1076 | static void collision_report(const char *zSql){ |
| 1077 | int i, j, kk; |
| 1078 | int nHash = 0; |
| 1079 | Stmt q; |
| 1080 | char zPrev[UUID_SIZE+1]; |
| 1081 | struct { |
| 1082 | int cnt; |
| 1083 | char *azHit[MAX_COLLIDE]; |
| 1084 | char z[UUID_SIZE+1]; |
| 1085 | } aCollide[UUID_SIZE+1]; |
| 1086 | memset(aCollide, 0, sizeof(aCollide)); |
| 1087 | memset(zPrev, 0, sizeof(zPrev)); |
| 1088 | db_prepare(&q,"%s",zSql/*safe-for-%s*/); |
| 1089 | while( db_step(&q)==SQLITE_ROW ){ |
| 1090 | const char *zUuid = db_column_text(&q,0); |
| 1091 | int n = db_column_bytes(&q,0); |
| 1092 | int i; |
| 1093 | nHash++; |
| @@ -1103,13 +1100,10 @@ | |
| 1100 | if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1); |
| 1101 | } |
| 1102 | memcpy(zPrev, zUuid, n+1); |
| 1103 | } |
| 1104 | db_finalize(&q); |
| 1105 | @ <table border=1><thead> |
| 1106 | @ <tr><th>Length<th>Instances<th>First Instance</tr> |
| 1107 | @ </thead><tbody> |
| 1108 | for(i=1; i<=UUID_SIZE; i++){ |
| 1109 | if( aCollide[i].cnt==0 ) continue; |
| @@ -1131,7 +1125,32 @@ | |
| 1125 | char *zId = aCollide[i].azHit[j]; |
| 1126 | if( zId==0 ) continue; |
| 1127 | @ %z(href("%R/whatis/%s",zId))%h(zId)</a> |
| 1128 | } |
| 1129 | } |
| 1130 | for(i=4; i<ArraySize(aCollide); i++){ |
| 1131 | for(j=0; j<aCollide[i].cnt && j<MAX_COLLIDE; j++){ |
| 1132 | fossil_free(aCollide[i].azHit[j]); |
| 1133 | } |
| 1134 | } |
| 1135 | } |
| 1136 | |
| 1137 | /* |
| 1138 | ** WEBPAGE: hash-collisions |
| 1139 | ** |
| 1140 | ** Show the number of hash collisions for hash prefixes of various lengths. |
| 1141 | */ |
| 1142 | void hash_collisions_webpage(void){ |
| 1143 | Stmt q; |
| 1144 | login_check_credentials(); |
| 1145 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| 1146 | style_header("SHA1 Prefix Collisions"); |
| 1147 | style_submenu_element("Activity Reports", 0, "reports"); |
| 1148 | style_submenu_element("Stats", 0, "stat"); |
| 1149 | @ <h1>Hash Prefix Collisions on Check-ins</h1> |
| 1150 | collision_report("SELECT (SELECT uuid FROM blob WHERE rid=objid)" |
| 1151 | " FROM event WHERE event.type='ci'" |
| 1152 | " ORDER BY 1"); |
| 1153 | @ <h1>Hash Prefix Collisions on All Artifacts</h1> |
| 1154 | collision_report("SELECT uuid FROM blob ORDER BY 1"); |
| 1155 | style_footer(); |
| 1156 | } |
| 1157 |