Use bounded string copies when renumbering
Some checks failed
akbasic CI Build / akgl_build (push) Has been cancelled
akbasic CI Build / mutation_test (push) Has been cancelled
akbasic CI Build / coverage (push) Has been cancelled
akbasic CI Build / cmake_build (push) Has been cancelled
akbasic CI Build / sanitizers (push) Has been cancelled

This commit is contained in:
2026-08-06 12:37:37 -04:00
parent e20fd445a4
commit 6896df1dff

View File

@@ -374,8 +374,10 @@ akerr_ErrorContext *akbasic_renumber(akbasic_Runtime *obj, int64_t newstart, int
* of running it over source that arrived without any. * of running it over source that arrived without any.
*/ */
obj->renumber_line.numbered = true; obj->renumber_line.numbered = true;
PASS(errctx, aksl_memcpy(&obj->source[i], &obj->renumber_line, PASS(errctx, aksl_strncpy(obj->source[i].code, AKBASIC_MAX_LINE_LENGTH,
sizeof(obj->source[i]))); obj->renumber_line.code, AKBASIC_MAX_LINE_LENGTH));
obj->source[i].lineno = obj->renumber_line.lineno;
obj->source[i].numbered = obj->renumber_line.numbered;
} }
/* Move the already-rewritten lines in place. The map is a partial /* Move the already-rewritten lines in place. The map is a partial
@@ -389,34 +391,47 @@ akerr_ErrorContext *akbasic_renumber(akbasic_Runtime *obj, int64_t newstart, int
if ( map[i] < 0 || obj->renumber_visited[i] ) { if ( map[i] < 0 || obj->renumber_visited[i] ) {
continue; continue;
} }
PASS(errctx, aksl_memcpy(&displaced, &obj->source[i], sizeof(displaced))); PASS(errctx, aksl_strncpy(displaced.code, AKBASIC_MAX_LINE_LENGTH,
obj->source[i].code, AKBASIC_MAX_LINE_LENGTH));
displaced.lineno = obj->source[i].lineno;
displaced.numbered = obj->source[i].numbered;
for ( ;; ) { for ( ;; ) {
int64_t destination = map[current]; int64_t destination = map[current];
obj->renumber_visited[current] = 1; obj->renumber_visited[current] = 1;
if ( destination == i ) { if ( destination == i ) {
displaced.lineno = destination; displaced.lineno = destination;
PASS(errctx, aksl_memcpy(&obj->source[destination], &displaced, PASS(errctx, aksl_strncpy(obj->source[destination].code, AKBASIC_MAX_LINE_LENGTH,
sizeof(displaced))); displaced.code, AKBASIC_MAX_LINE_LENGTH));
obj->source[destination].lineno = displaced.lineno;
obj->source[destination].numbered = displaced.numbered;
break; break;
} }
if ( map[destination] < 0 ) { if ( map[destination] < 0 ) {
displaced.lineno = destination; displaced.lineno = destination;
PASS(errctx, aksl_memcpy(&obj->source[destination], &displaced, PASS(errctx, aksl_strncpy(obj->source[destination].code, AKBASIC_MAX_LINE_LENGTH,
sizeof(displaced))); displaced.code, AKBASIC_MAX_LINE_LENGTH));
obj->source[destination].lineno = displaced.lineno;
obj->source[destination].numbered = displaced.numbered;
PASS(errctx, aksl_memset(&obj->source[current], 0, PASS(errctx, aksl_memset(&obj->source[current], 0,
sizeof(obj->source[current]))); sizeof(obj->source[current])));
break; break;
} }
PASS(errctx, aksl_memcpy(&next_line, &obj->source[destination], PASS(errctx, aksl_strncpy(next_line.code, AKBASIC_MAX_LINE_LENGTH,
sizeof(displaced))); obj->source[destination].code, AKBASIC_MAX_LINE_LENGTH));
next_line.lineno = obj->source[destination].lineno;
next_line.numbered = obj->source[destination].numbered;
displaced.lineno = destination; displaced.lineno = destination;
PASS(errctx, aksl_memcpy(&obj->source[destination], &displaced, PASS(errctx, aksl_strncpy(obj->source[destination].code, AKBASIC_MAX_LINE_LENGTH,
sizeof(obj->renumber_line))); displaced.code, AKBASIC_MAX_LINE_LENGTH));
obj->source[destination].lineno = displaced.lineno;
obj->source[destination].numbered = displaced.numbered;
PASS(errctx, aksl_memset(&obj->source[current], 0, PASS(errctx, aksl_memset(&obj->source[current], 0,
sizeof(obj->source[current]))); sizeof(obj->source[current])));
PASS(errctx, aksl_memcpy(&displaced, &next_line, PASS(errctx, aksl_strncpy(displaced.code, AKBASIC_MAX_LINE_LENGTH,
sizeof(displaced))); next_line.code, AKBASIC_MAX_LINE_LENGTH));
displaced.lineno = next_line.lineno;
displaced.numbered = next_line.numbered;
current = destination; current = destination;
} }
} }