commit 90eac7479efe209eac4df46846fb74851d671ef8 from: Martin Pieuchot date: Fri Mar 20 15:08:23 2020 UTC Pass all input argument as "struct diff_input_info". While here do not use fallback and simply fail if no lenght is given. commit - 77bc4063d431dcbbc3ebf020af460125fee542fe commit + 90eac7479efe209eac4df46846fb74851d671ef8 blob - 17829097700834511f9f84544d113cbf0d7acb91 blob + 8a5fbac42174d13210c2a2d5ea97001cf95950f4 --- diff.c +++ diff.c @@ -114,20 +114,24 @@ diffreg(char *file1, char *file2, int flags, int conte { char *str1, *str2; struct stat st1, st2; - struct diff_input_info info = { - .left_path = file1, - .right_path = file2, - }; + struct diff_input_info info; str1 = mmapfile(file1, &st1); str2 = mmapfile(file2, &st2); + info = (struct diff_input_info) { + .left_path = file1, + .left_buffer = str1, + .left_size = st1.st_size, + .right_path = file2, + .right_buffer = str2, + .right_size = st2.st_size, + }; + if (flags & F_UNIFIED) - diff_unidiff(stdout, &diff_config, &info, str1, st1.st_size, - str2, st2.st_size, context); + diff_unidiff(stdout, &diff_config, &info, context); else - diff_plain(stdout, &diff_config, &info, str1, st1.st_size, - str2, st2.st_size); + diff_plain(stdout, &diff_config, &info); munmap(str1, st1.st_size); munmap(str2, st2.st_size); blob - f86788bf0db4651a1769f4abf4bbb9c04e11e60d blob + 2af135b66a21409f60158b61d17612fdbaf53cb7 --- diff_main.h +++ diff_main.h @@ -356,14 +356,16 @@ void diff_result_free(struct diff_result *result); struct diff_input_info { const char *arbitrary_info; const char *left_path; + const char *left_buffer; + off_t left_size; const char *right_path; + const char *right_buffer; + off_t right_size; }; enum diff_rc diff_plain(FILE *dest, const struct diff_config *diff_config, - const struct diff_input_info *info, - const char *left, int left_len, const char *right, int right_len); + const struct diff_input_info *info); enum diff_rc diff_unidiff(FILE *dest, const struct diff_config *diff_config, const struct diff_input_info *info, - const char *left, int left_len, const char *right, int right_len, unsigned int context_lines); blob - c1bb9102eea8d902ba0d018a47e4ba4ae1a2f631 blob + 5f5769aa7ddcab3c2cb38ad4156cc8e208647fd4 --- diff_output.c +++ diff_output.c @@ -23,7 +23,6 @@ #include #include #include -#include #include "diff_main.h" #include "debug.h" @@ -103,15 +102,18 @@ diff_output_plain(FILE *dest, const struct diff_input_ enum diff_rc diff_plain(FILE *dest, const struct diff_config *diff_config, - const struct diff_input_info *info, - const char *left, int left_len, const char *right, int right_len) + const struct diff_input_info *info) { struct diff_result *result; + int left_len, right_len; enum diff_rc rc; - left_len = left_len < 0 ? strlen(left) : left_len; - right_len = right_len < 0 ? strlen(right) : right_len; - result = diff_main(diff_config, left, left_len, right, right_len); + left_len = info->left_size; + right_len = info->right_size; + if (left_len < 0 || right_len < 0) + return DIFF_RC_EINVAL; + result = diff_main(diff_config, info->left_buffer, left_len, + info->right_buffer, right_len); if (!result) return DIFF_RC_EINVAL; if (result->rc != DIFF_RC_OK) @@ -345,16 +347,18 @@ diff_output_unidiff(FILE *dest, const struct diff_inpu enum diff_rc diff_unidiff(FILE *dest, const struct diff_config *diff_config, - const struct diff_input_info *info, - const char *left, int left_len, const char *right, int right_len, - unsigned int context_lines) + const struct diff_input_info *info, unsigned int context_lines) { struct diff_result *result; + int left_len, right_len; enum diff_rc rc; - left_len = left_len < 0 ? strlen(left) : left_len; - right_len = right_len < 0 ? strlen(right) : right_len; - result = diff_main(diff_config, left, left_len, right, right_len); + left_len = info->left_size; + right_len = info->right_size; + if (left_len < 0 || right_len < 0) + return DIFF_RC_EINVAL; + result = diff_main(diff_config, info->left_buffer, left_len, + info->right_buffer, right_len); if (!result) return DIFF_RC_EINVAL; if (result->rc != DIFF_RC_OK)