@@ -171,23 +171,6 @@ static int should_write_log(struct ref_store *refs, const char *refname)
171171 }
172172}
173173
174- static void clear_reftable_log_record (struct reftable_log_record * log )
175- {
176- switch (log -> value_type ) {
177- case REFTABLE_LOG_UPDATE :
178- /*
179- * When we write log records, the hashes are owned by the
180- * caller and thus shouldn't be free'd.
181- */
182- log -> value .update .old_hash = NULL ;
183- log -> value .update .new_hash = NULL ;
184- break ;
185- case REFTABLE_LOG_DELETION :
186- break ;
187- }
188- reftable_log_record_release (log );
189- }
190-
191174static void fill_reftable_log_record (struct reftable_log_record * log )
192175{
193176 const char * info = git_committer_info (0 );
@@ -1106,8 +1089,8 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
11061089 fill_reftable_log_record (log );
11071090 log -> update_index = ts ;
11081091 log -> refname = xstrdup (u -> refname );
1109- log -> value .update .new_hash = u -> new_oid .hash ;
1110- log -> value .update .old_hash = tx_update -> current_oid .hash ;
1092+ memcpy ( log -> value .update .new_hash , u -> new_oid .hash , GIT_MAX_RAWSZ ) ;
1093+ memcpy ( log -> value .update .old_hash , tx_update -> current_oid .hash , GIT_MAX_RAWSZ ) ;
11111094 log -> value .update .message =
11121095 xstrndup (u -> msg , arg -> refs -> write_options .block_size / 2 );
11131096 }
@@ -1162,7 +1145,7 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
11621145done :
11631146 assert (ret != REFTABLE_API_ERROR );
11641147 for (i = 0 ; i < logs_nr ; i ++ )
1165- clear_reftable_log_record (& logs [i ]);
1148+ reftable_log_record_release (& logs [i ]);
11661149 free (logs );
11671150 return ret ;
11681151}
@@ -1279,13 +1262,13 @@ static int write_create_symref_table(struct reftable_writer *writer, void *cb_da
12791262 log .update_index = ts ;
12801263 log .value .update .message = xstrndup (create -> logmsg ,
12811264 create -> refs -> write_options .block_size / 2 );
1282- log .value .update .new_hash = new_oid .hash ;
1265+ memcpy ( log .value .update .new_hash , new_oid .hash , GIT_MAX_RAWSZ ) ;
12831266 if (refs_resolve_ref_unsafe (& create -> refs -> base , create -> refname ,
12841267 RESOLVE_REF_READING , & old_oid , NULL ))
1285- log .value .update .old_hash = old_oid .hash ;
1268+ memcpy ( log .value .update .old_hash , old_oid .hash , GIT_MAX_RAWSZ ) ;
12861269
12871270 ret = reftable_writer_add_log (writer , & log );
1288- clear_reftable_log_record (& log );
1271+ reftable_log_record_release (& log );
12891272 return ret ;
12901273}
12911274
@@ -1424,7 +1407,7 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
14241407 logs [logs_nr ].update_index = deletion_ts ;
14251408 logs [logs_nr ].value .update .message =
14261409 xstrndup (arg -> logmsg , arg -> refs -> write_options .block_size / 2 );
1427- logs [logs_nr ].value .update .old_hash = old_ref .value .val1 ;
1410+ memcpy ( logs [logs_nr ].value .update .old_hash , old_ref .value .val1 , GIT_MAX_RAWSZ ) ;
14281411 logs_nr ++ ;
14291412
14301413 ret = read_ref_without_reload (arg -> stack , "HEAD" , & head_oid , & head_referent , & head_type );
@@ -1456,7 +1439,7 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
14561439 logs [logs_nr ].update_index = creation_ts ;
14571440 logs [logs_nr ].value .update .message =
14581441 xstrndup (arg -> logmsg , arg -> refs -> write_options .block_size / 2 );
1459- logs [logs_nr ].value .update .new_hash = old_ref .value .val1 ;
1442+ memcpy ( logs [logs_nr ].value .update .new_hash , old_ref .value .val1 , GIT_MAX_RAWSZ ) ;
14601443 logs_nr ++ ;
14611444
14621445 /*
@@ -1519,10 +1502,6 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
15191502 for (i = 0 ; i < logs_nr ; i ++ ) {
15201503 if (!strcmp (logs [i ].refname , "HEAD" ))
15211504 continue ;
1522- if (logs [i ].value .update .old_hash == old_ref .value .val1 )
1523- logs [i ].value .update .old_hash = NULL ;
1524- if (logs [i ].value .update .new_hash == old_ref .value .val1 )
1525- logs [i ].value .update .new_hash = NULL ;
15261505 logs [i ].refname = NULL ;
15271506 reftable_log_record_release (& logs [i ]);
15281507 }
@@ -1600,7 +1579,7 @@ struct reftable_reflog_iterator {
16001579 struct reftable_ref_store * refs ;
16011580 struct reftable_iterator iter ;
16021581 struct reftable_log_record log ;
1603- char * last_name ;
1582+ struct strbuf last_name ;
16041583 int err ;
16051584};
16061585
@@ -1619,15 +1598,15 @@ static int reftable_reflog_iterator_advance(struct ref_iterator *ref_iterator)
16191598 * we've already produced this name. This could be faster by
16201599 * seeking directly to reflog@update_index==0.
16211600 */
1622- if (iter -> last_name && !strcmp (iter -> log .refname , iter -> last_name ))
1601+ if (!strcmp (iter -> log .refname , iter -> last_name . buf ))
16231602 continue ;
16241603
16251604 if (check_refname_format (iter -> log .refname ,
16261605 REFNAME_ALLOW_ONELEVEL ))
16271606 continue ;
16281607
1629- free ( iter -> last_name );
1630- iter -> last_name = xstrdup ( iter -> log .refname );
1608+ strbuf_reset ( & iter -> last_name );
1609+ strbuf_addstr ( & iter -> last_name , iter -> log .refname );
16311610 iter -> base .refname = iter -> log .refname ;
16321611
16331612 break ;
@@ -1660,7 +1639,7 @@ static int reftable_reflog_iterator_abort(struct ref_iterator *ref_iterator)
16601639 (struct reftable_reflog_iterator * )ref_iterator ;
16611640 reftable_log_record_release (& iter -> log );
16621641 reftable_iterator_destroy (& iter -> iter );
1663- free ( iter -> last_name );
1642+ strbuf_release ( & iter -> last_name );
16641643 free (iter );
16651644 return ITER_DONE ;
16661645}
@@ -1680,13 +1659,14 @@ static struct reftable_reflog_iterator *reflog_iterator_for_stack(struct reftabl
16801659
16811660 iter = xcalloc (1 , sizeof (* iter ));
16821661 base_ref_iterator_init (& iter -> base , & reftable_reflog_iterator_vtable );
1662+ strbuf_init (& iter -> last_name , 0 );
16831663 iter -> refs = refs ;
16841664
16851665 ret = refs -> err ;
16861666 if (ret )
16871667 goto done ;
16881668
1689- ret = reftable_stack_reload (refs -> main_stack );
1669+ ret = reftable_stack_reload (stack );
16901670 if (ret < 0 )
16911671 goto done ;
16921672
@@ -2184,7 +2164,7 @@ static int reftable_be_reflog_expire(struct ref_store *ref_store,
21842164 dest -> value_type = REFTABLE_LOG_DELETION ;
21852165 } else {
21862166 if ((flags & EXPIRE_REFLOGS_REWRITE ) && last_hash )
2187- dest -> value .update .old_hash = last_hash ;
2167+ memcpy ( dest -> value .update .old_hash , last_hash , GIT_MAX_RAWSZ ) ;
21882168 last_hash = logs [i ].value .update .new_hash ;
21892169 }
21902170 }
0 commit comments