чување a5d7604bcb37c64832ef8d6d877758b58eee82b1
родитељ b77e0ed4ba44ffa9171e8d1d8375d7026278f038
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Sun, 9 Jun 2024 02:19:44 +0200
Bugfix: properly set new_file; bugfix: set dirname of local files to .;
a few more strncpy -> memccpy
Diffstat:
измењених датотека: 3, додавања: 28(+), брисања: 19(-)
diff --git a/draw.c b/draw.c
@@ -128,7 +128,7 @@ init_drawstate(struct DrawState* state, char* error, char* action,
state->input_update_callback = NULL;
state->running = 1;
state->dirty = 0;
- state->new_file = 1;
+ state->new_file = 0;
state->recalculate_size = 1;
CLEAR(state->mode,
M_HELP | M_INPUT | M_INPUT_NUM | M_PROMPT | M_SELECTION);
@@ -782,8 +782,8 @@ draw_status(const struct DrawState* state)
pseg->callback(buf, limits[L_LINE_MAX],
pseg->format, seg_size, state);
else
- strncpy(buf, pseg->format, limits[L_LINE_MAX]);
- buf[limits[L_LINE_MAX] - 1] = 0;
+ memccpy(buf, pseg->format, 0,
+ limits[L_LINE_MAX]);
if (pseg == status_segments + LEN(status_segments) - 1)
seg_size = state->maxx - 1 - current_start;
if (!draw_string(current_start, state->maxy - 1,
diff --git a/sled.c b/sled.c
@@ -221,7 +221,7 @@ dirname(char* dir, char* path, const size_t dir_size)
*p = 0;
return dir;
}
- else if (p == dir)
+ else if (p == dir && *p == '/')
return dir;
}
dir[0] = '.';
@@ -451,7 +451,7 @@ void
handle_key_event(struct tb_event* ev, struct DrawState* state)
{
const struct Key* current = NULL;
- const char* temp = NULL;
+ char* temp = NULL;
if (!state)
return;
@@ -1982,8 +1982,7 @@ paste_from_paste(struct DrawState* state)
newpos.col = state->paste[state->paste_count - 1].length;
newpos.row += state->paste_count - 1;
state->saved_column = display_length(state,
- state->paste[state->paste_count - 1].text,
- newpos.col);
+ state->paste[state->paste_count - 1].text, newpos.col);
}
position_to(state, newpos.row, newpos.col);
@@ -2573,8 +2572,7 @@ main(int argc, char** argv)
}
*filename = 0;
- strncpy(filename, argv[1], limits[L_PATH_MAX]);
- filename[limits[L_PATH_MAX] - 1] = 0;
+ MEMCCPY(filename, argv[1], limits[L_PATH_MAX], temp);
if (!*filename)
{
free(filename);
@@ -2657,7 +2655,12 @@ main(int argc, char** argv)
: (state.rfn_len > 0 ? state.real_filename
: state.filename),
limits[L_PATH_MAX], temp);
- MEMCCPY(temp - 1, backup_suffix, limits[L_PATH_MAX], temp);
+ if (!temp) /* filename is full, turning off backups */
+ state.backup_possible = 0;
+ else
+ MEMCCPY_EXT((temp - 1), state.backup_filename, backup_suffix,
+ limits[L_PATH_MAX] + temp - state.backup_filename,
+ temp);
#ifdef __OpenBSD__
if (unveil(state.backup_filename, "rwc") < 0)
{
@@ -2694,7 +2697,8 @@ main(int argc, char** argv)
dir_access = access(dir, W_OK | X_OK);
dir_access_errno = errno;
#ifdef BACKUP_FAIL_OK
- state.backup_possible = dir_access != -1;
+ if (state.backup_possible)
+ state.backup_possible = dir_access != -1;
#endif /* BACKUP_FAIL_OK */
if (stat(state.filename, &st) == -1)
{
diff --git a/util.h b/util.h
@@ -10,14 +10,19 @@
#define LEN(x) (sizeof(x) / sizeof(x[0]))
#define MAX(a, b) ((a > b) ? (a) : (b))
#define MIN(a, b) ((a < b) ? (a) : (b))
-#define MEMCCPY(to, from, tolen, temp) \
- do \
- { \
- if (!(temp = memccpy(to, from, 0, tolen))) \
- { \
- print_error(1, "memccpy:%d: Overflow", __LINE__); \
- exit(1); \
- } \
+#define MEMCCPY(to, from, tolen, temp) \
+ do \
+ { \
+ temp = memccpy(to, from, 0, tolen); \
+ if (!temp) \
+ to[tolen - 1] = 0; \
+ } while (0)
+#define MEMCCPY_EXT(to, fallbackto, from, tolen, temp) \
+ do \
+ { \
+ temp = memccpy(to, from, 0, tolen); \
+ if (!temp) \
+ fallbackto[tolen - 1] = 0; \
} while (0)
#define ENSURE_SIZE(to, temp, tosize, testsize, fromsize, label, type) \