Fossil SCM
Fix a problem in /hash-collisions that was causing the links to remain directed to the honeypot.
Commit
aa12ac91cf930d0073607690d461b2421a68447c
Parent
327eee14525ff1c…
1 file changed
+14
-9
+14
-9
| --- src/name.c | ||
| +++ src/name.c | ||
| @@ -1064,44 +1064,45 @@ | ||
| 1064 | 1064 | void test_phatoms_cmd(void){ |
| 1065 | 1065 | db_find_and_open_repository(0,0); |
| 1066 | 1066 | describe_artifacts_to_stdout("IN (SELECT rid FROM blob WHERE size<0)", 0); |
| 1067 | 1067 | } |
| 1068 | 1068 | |
| 1069 | +/* Maximum number of collision examples to remember */ | |
| 1070 | +#define MAX_COLLIDE 25 | |
| 1071 | + | |
| 1069 | 1072 | /* |
| 1070 | 1073 | ** WEBPAGE: hash-collisions |
| 1071 | 1074 | ** |
| 1072 | 1075 | ** Show the number of hash collisions for hash prefixes of various lengths. |
| 1073 | 1076 | */ |
| 1074 | 1077 | void hash_collisions_webpage(void){ |
| 1075 | - int i, kk; | |
| 1078 | + int i, j, kk; | |
| 1076 | 1079 | int nHash = 0; |
| 1077 | 1080 | Stmt q; |
| 1078 | 1081 | char zPrev[UUID_SIZE+1]; |
| 1079 | 1082 | struct { |
| 1080 | 1083 | int cnt; |
| 1081 | - Blob ex; | |
| 1084 | + char *azHit[MAX_COLLIDE]; | |
| 1082 | 1085 | char z[UUID_SIZE+1]; |
| 1083 | 1086 | } aCollide[UUID_SIZE+1]; |
| 1084 | 1087 | login_check_credentials(); |
| 1085 | 1088 | if( !g.perm.Read ){ login_needed(); return; } |
| 1086 | 1089 | memset(aCollide, 0, sizeof(aCollide)); |
| 1087 | - for(i=0; i<ArraySize(aCollide); i++) blob_init(&aCollide[i].ex,0,0); | |
| 1088 | 1090 | memset(zPrev, 0, sizeof(zPrev)); |
| 1089 | 1091 | db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1"); |
| 1090 | 1092 | while( db_step(&q)==SQLITE_ROW ){ |
| 1091 | 1093 | const char *zUuid = db_column_text(&q,0); |
| 1092 | 1094 | int n = db_column_bytes(&q,0); |
| 1093 | 1095 | int i; |
| 1094 | 1096 | nHash++; |
| 1095 | 1097 | for(i=0; zPrev[i] && zPrev[i]==zUuid[i]; i++){} |
| 1096 | 1098 | if( i>0 && i<=UUID_SIZE ){ |
| 1099 | + if( i>=4 && aCollide[i].cnt<MAX_COLLIDE ){ | |
| 1100 | + aCollide[i].azHit[aCollide[i].cnt] = mprintf("%.*s", i, zPrev); | |
| 1101 | + } | |
| 1097 | 1102 | aCollide[i].cnt++; |
| 1098 | 1103 | if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1); |
| 1099 | - if( aCollide[i].cnt<25 ){ | |
| 1100 | - blob_appendf(&aCollide[i].ex, " %z%.*s</a>", | |
| 1101 | - href("%R/whatis/%.*s", i, zPrev), i, zPrev); | |
| 1102 | - } | |
| 1103 | 1104 | } |
| 1104 | 1105 | memcpy(zPrev, zUuid, n+1); |
| 1105 | 1106 | } |
| 1106 | 1107 | db_finalize(&q); |
| 1107 | 1108 | style_header("Hash Prefix Collisions"); |
| @@ -1113,18 +1114,22 @@ | ||
| 1113 | 1114 | @ <tr><td>%d(i)<td>%d(aCollide[i].cnt)<td>%h(aCollide[i].z)</tr> |
| 1114 | 1115 | } |
| 1115 | 1116 | @ </tbody></table> |
| 1116 | 1117 | @ <p>Total number of hashes: %d(nHash)</p> |
| 1117 | 1118 | kk = 0; |
| 1118 | - for(i=UUID_SIZE; i>=0; i--){ | |
| 1119 | + for(i=UUID_SIZE; i>=4; i--){ | |
| 1119 | 1120 | if( aCollide[i].cnt==0 ) continue; |
| 1120 | 1121 | if( aCollide[i].cnt>200 ) break; |
| 1121 | 1122 | kk += aCollide[i].cnt; |
| 1122 | 1123 | if( aCollide[i].cnt<25 ){ |
| 1123 | 1124 | @ <p>Collisions of length %d(i): |
| 1124 | 1125 | }else{ |
| 1125 | 1126 | @ <p>First 25 collisions of length %d(i): |
| 1126 | 1127 | } |
| 1127 | - @ %s(blob_str(&aCollide[i].ex))</p> | |
| 1128 | + for(j=0; j<aCollide[i].cnt && j<MAX_COLLIDE; j++){ | |
| 1129 | + char *zId = aCollide[i].azHit[j]; | |
| 1130 | + if( zId==0 ) continue; | |
| 1131 | + @ %z(href("%R/whatis/%s",zId))%h(zId)</a> | |
| 1132 | + } | |
| 1128 | 1133 | } |
| 1129 | 1134 | style_footer(); |
| 1130 | 1135 | } |
| 1131 | 1136 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -1064,44 +1064,45 @@ | |
| 1064 | void test_phatoms_cmd(void){ |
| 1065 | db_find_and_open_repository(0,0); |
| 1066 | describe_artifacts_to_stdout("IN (SELECT rid FROM blob WHERE size<0)", 0); |
| 1067 | } |
| 1068 | |
| 1069 | /* |
| 1070 | ** WEBPAGE: hash-collisions |
| 1071 | ** |
| 1072 | ** Show the number of hash collisions for hash prefixes of various lengths. |
| 1073 | */ |
| 1074 | void hash_collisions_webpage(void){ |
| 1075 | int i, kk; |
| 1076 | int nHash = 0; |
| 1077 | Stmt q; |
| 1078 | char zPrev[UUID_SIZE+1]; |
| 1079 | struct { |
| 1080 | int cnt; |
| 1081 | Blob ex; |
| 1082 | char z[UUID_SIZE+1]; |
| 1083 | } aCollide[UUID_SIZE+1]; |
| 1084 | login_check_credentials(); |
| 1085 | if( !g.perm.Read ){ login_needed(); return; } |
| 1086 | memset(aCollide, 0, sizeof(aCollide)); |
| 1087 | for(i=0; i<ArraySize(aCollide); i++) blob_init(&aCollide[i].ex,0,0); |
| 1088 | memset(zPrev, 0, sizeof(zPrev)); |
| 1089 | db_prepare(&q,"SELECT uuid FROM blob ORDER BY 1"); |
| 1090 | while( db_step(&q)==SQLITE_ROW ){ |
| 1091 | const char *zUuid = db_column_text(&q,0); |
| 1092 | int n = db_column_bytes(&q,0); |
| 1093 | int i; |
| 1094 | nHash++; |
| 1095 | for(i=0; zPrev[i] && zPrev[i]==zUuid[i]; i++){} |
| 1096 | if( i>0 && i<=UUID_SIZE ){ |
| 1097 | aCollide[i].cnt++; |
| 1098 | if( aCollide[i].z[0]==0 ) memcpy(aCollide[i].z, zPrev, n+1); |
| 1099 | if( aCollide[i].cnt<25 ){ |
| 1100 | blob_appendf(&aCollide[i].ex, " %z%.*s</a>", |
| 1101 | href("%R/whatis/%.*s", i, zPrev), i, zPrev); |
| 1102 | } |
| 1103 | } |
| 1104 | memcpy(zPrev, zUuid, n+1); |
| 1105 | } |
| 1106 | db_finalize(&q); |
| 1107 | style_header("Hash Prefix Collisions"); |
| @@ -1113,18 +1114,22 @@ | |
| 1113 | @ <tr><td>%d(i)<td>%d(aCollide[i].cnt)<td>%h(aCollide[i].z)</tr> |
| 1114 | } |
| 1115 | @ </tbody></table> |
| 1116 | @ <p>Total number of hashes: %d(nHash)</p> |
| 1117 | kk = 0; |
| 1118 | for(i=UUID_SIZE; i>=0; i--){ |
| 1119 | if( aCollide[i].cnt==0 ) continue; |
| 1120 | if( aCollide[i].cnt>200 ) break; |
| 1121 | kk += aCollide[i].cnt; |
| 1122 | if( aCollide[i].cnt<25 ){ |
| 1123 | @ <p>Collisions of length %d(i): |
| 1124 | }else{ |
| 1125 | @ <p>First 25 collisions of length %d(i): |
| 1126 | } |
| 1127 | @ %s(blob_str(&aCollide[i].ex))</p> |
| 1128 | } |
| 1129 | style_footer(); |
| 1130 | } |
| 1131 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -1064,44 +1064,45 @@ | |
| 1064 | void test_phatoms_cmd(void){ |
| 1065 | db_find_and_open_repository(0,0); |
| 1066 | describe_artifacts_to_stdout("IN (SELECT rid FROM blob WHERE size<0)", 0); |
| 1067 | } |
| 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(); 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++; |
| 1097 | for(i=0; zPrev[i] && zPrev[i]==zUuid[i]; i++){} |
| 1098 | if( i>0 && i<=UUID_SIZE ){ |
| 1099 | if( i>=4 && aCollide[i].cnt<MAX_COLLIDE ){ |
| 1100 | aCollide[i].azHit[aCollide[i].cnt] = mprintf("%.*s", i, zPrev); |
| 1101 | } |
| 1102 | aCollide[i].cnt++; |
| 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("Hash Prefix Collisions"); |
| @@ -1113,18 +1114,22 @@ | |
| 1114 | @ <tr><td>%d(i)<td>%d(aCollide[i].cnt)<td>%h(aCollide[i].z)</tr> |
| 1115 | } |
| 1116 | @ </tbody></table> |
| 1117 | @ <p>Total number of hashes: %d(nHash)</p> |
| 1118 | kk = 0; |
| 1119 | for(i=UUID_SIZE; i>=4; i--){ |
| 1120 | if( aCollide[i].cnt==0 ) continue; |
| 1121 | if( aCollide[i].cnt>200 ) break; |
| 1122 | kk += aCollide[i].cnt; |
| 1123 | if( aCollide[i].cnt<25 ){ |
| 1124 | @ <p>Collisions of length %d(i): |
| 1125 | }else{ |
| 1126 | @ <p>First 25 collisions of length %d(i): |
| 1127 | } |
| 1128 | for(j=0; j<aCollide[i].cnt && j<MAX_COLLIDE; j++){ |
| 1129 | char *zId = aCollide[i].azHit[j]; |
| 1130 | if( zId==0 ) continue; |
| 1131 | @ %z(href("%R/whatis/%s",zId))%h(zId)</a> |
| 1132 | } |
| 1133 | } |
| 1134 | style_footer(); |
| 1135 | } |
| 1136 |