mirror of
https://github.com/systemd/systemd.git
synced 2025-01-07 21:18:41 +03:00
Merge pull request #34025 from YHNdnzj/edit-util-wrong-place
edit-util: catch and warn about edits outside of markers
This commit is contained in:
commit
dff27ce65a
@ -156,7 +156,7 @@ int ascii_strcasecmp_nn(const char *a, size_t n, const char *b, size_t m);
|
|||||||
|
|
||||||
bool chars_intersect(const char *a, const char *b) _pure_;
|
bool chars_intersect(const char *a, const char *b) _pure_;
|
||||||
|
|
||||||
static inline bool _pure_ in_charset(const char *s, const char* charset) {
|
static inline bool _pure_ in_charset(const char *s, const char *charset) {
|
||||||
assert(s);
|
assert(s);
|
||||||
assert(charset);
|
assert(charset);
|
||||||
return s[strspn(s, charset)] == '\0';
|
return s[strspn(s, charset)] == '\0';
|
||||||
@ -248,7 +248,7 @@ REENABLE_WARNING;
|
|||||||
/* Like startswith_no_case(), but operates on arbitrary memory blocks.
|
/* Like startswith_no_case(), but operates on arbitrary memory blocks.
|
||||||
* It works only for ASCII strings.
|
* It works only for ASCII strings.
|
||||||
*/
|
*/
|
||||||
static inline void *memory_startswith_no_case(const void *p, size_t sz, const char *token) {
|
static inline void* memory_startswith_no_case(const void *p, size_t sz, const char *token) {
|
||||||
assert(token);
|
assert(token);
|
||||||
|
|
||||||
size_t n = strlen(token);
|
size_t n = strlen(token);
|
||||||
|
@ -315,10 +315,12 @@ static int run_editor(const EditFileContext *context) {
|
|||||||
static int strip_edit_temp_file(EditFile *e) {
|
static int strip_edit_temp_file(EditFile *e) {
|
||||||
_cleanup_free_ char *old_contents = NULL, *tmp = NULL, *new_contents = NULL;
|
_cleanup_free_ char *old_contents = NULL, *tmp = NULL, *new_contents = NULL;
|
||||||
const char *stripped;
|
const char *stripped;
|
||||||
|
bool with_marker;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(e);
|
assert(e);
|
||||||
assert(e->context);
|
assert(e->context);
|
||||||
|
assert(!e->context->marker_start == !e->context->marker_end);
|
||||||
assert(e->temp);
|
assert(e->temp);
|
||||||
|
|
||||||
r = read_full_file(e->temp, &old_contents, NULL);
|
r = read_full_file(e->temp, &old_contents, NULL);
|
||||||
@ -329,12 +331,12 @@ static int strip_edit_temp_file(EditFile *e) {
|
|||||||
if (!tmp)
|
if (!tmp)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
if (e->context->marker_start && !e->context->stdin) {
|
with_marker = e->context->marker_start && !e->context->stdin;
|
||||||
|
|
||||||
|
if (with_marker) {
|
||||||
/* Trim out the lines between the two markers */
|
/* Trim out the lines between the two markers */
|
||||||
char *contents_start, *contents_end;
|
char *contents_start, *contents_end;
|
||||||
|
|
||||||
assert(e->context->marker_end);
|
|
||||||
|
|
||||||
contents_start = strstrafter(tmp, e->context->marker_start) ?: tmp;
|
contents_start = strstrafter(tmp, e->context->marker_start) ?: tmp;
|
||||||
|
|
||||||
contents_end = strstr(contents_start, e->context->marker_end);
|
contents_end = strstr(contents_start, e->context->marker_end);
|
||||||
@ -345,8 +347,28 @@ static int strip_edit_temp_file(EditFile *e) {
|
|||||||
} else
|
} else
|
||||||
stripped = strstrip(tmp);
|
stripped = strstrip(tmp);
|
||||||
|
|
||||||
if (isempty(stripped))
|
if (isempty(stripped)) {
|
||||||
|
/* People keep coming back to #24208 due to edits outside of markers. Let's detect this
|
||||||
|
* and point them in the right direction. */
|
||||||
|
if (with_marker)
|
||||||
|
for (const char *p = old_contents;;) {
|
||||||
|
p = skip_leading_chars(p, WHITESPACE);
|
||||||
|
if (*p == '\0')
|
||||||
|
break;
|
||||||
|
if (*p != '#') {
|
||||||
|
log_warning("Found modifications outside of the staging area, which would be discarded.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip the whole line if commented out */
|
||||||
|
p = strchr(p, '\n');
|
||||||
|
if (!p)
|
||||||
|
break;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
return 0; /* File is empty (has no real changes) */
|
return 0; /* File is empty (has no real changes) */
|
||||||
|
}
|
||||||
|
|
||||||
/* Trim prefix and suffix, but ensure suffixed by single newline */
|
/* Trim prefix and suffix, but ensure suffixed by single newline */
|
||||||
new_contents = strjoin(stripped, "\n");
|
new_contents = strjoin(stripped, "\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user