YARN-5736. YARN container executor config does not handle white space (miklos.szegedi@cloudera.com via rkanter)
This commit is contained in:
parent
283fa33feb
commit
09f43fa9c0
@ -31,6 +31,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
#define MAX_SIZE 10
|
#define MAX_SIZE 10
|
||||||
|
|
||||||
@ -126,6 +127,37 @@ int check_configuration_permissions(const char* file_name) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trim whitespace from beginning and end.
|
||||||
|
*/
|
||||||
|
char* trim(char* input)
|
||||||
|
{
|
||||||
|
char *val_begin;
|
||||||
|
char *val_end;
|
||||||
|
char *ret;
|
||||||
|
|
||||||
|
if (input == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
val_begin = input;
|
||||||
|
val_end = input + strlen(input);
|
||||||
|
|
||||||
|
while (val_begin < val_end && isspace(*val_begin))
|
||||||
|
val_begin++;
|
||||||
|
while (val_end > val_begin && isspace(*(val_end - 1)))
|
||||||
|
val_end--;
|
||||||
|
|
||||||
|
ret = (char *) malloc(
|
||||||
|
sizeof(char) * (val_end - val_begin + 1));
|
||||||
|
if (ret == NULL) {
|
||||||
|
fprintf(ERRORFILE, "Allocation error\n");
|
||||||
|
exit(OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(ret, val_begin, val_end - val_begin);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void read_config(const char* file_name, struct configuration *cfg) {
|
void read_config(const char* file_name, struct configuration *cfg) {
|
||||||
FILE *conf_file;
|
FILE *conf_file;
|
||||||
@ -202,9 +234,8 @@ void read_config(const char* file_name, struct configuration *cfg) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
memset(cfg->confdetails[cfg->size], 0, sizeof(struct confentry));
|
memset(cfg->confdetails[cfg->size], 0, sizeof(struct confentry));
|
||||||
cfg->confdetails[cfg->size]->key = (char *) malloc(
|
cfg->confdetails[cfg->size]->key = trim(equaltok);
|
||||||
sizeof(char) * (strlen(equaltok)+1));
|
|
||||||
strcpy((char *)cfg->confdetails[cfg->size]->key, equaltok);
|
|
||||||
equaltok = strtok_r(NULL, "=", &temp_equaltok);
|
equaltok = strtok_r(NULL, "=", &temp_equaltok);
|
||||||
if (equaltok == NULL) {
|
if (equaltok == NULL) {
|
||||||
fprintf(LOGFILE, "configuration tokenization failed \n");
|
fprintf(LOGFILE, "configuration tokenization failed \n");
|
||||||
@ -222,9 +253,7 @@ void read_config(const char* file_name, struct configuration *cfg) {
|
|||||||
fprintf(LOGFILE, "read_config : Adding conf value : %s \n", equaltok);
|
fprintf(LOGFILE, "read_config : Adding conf value : %s \n", equaltok);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cfg->confdetails[cfg->size]->value = (char *) malloc(
|
cfg->confdetails[cfg->size]->value = trim(equaltok);
|
||||||
sizeof(char) * (strlen(equaltok)+1));
|
|
||||||
strcpy((char *)cfg->confdetails[cfg->size]->value, equaltok);
|
|
||||||
if((cfg->size + 1) % MAX_SIZE == 0) {
|
if((cfg->size + 1) % MAX_SIZE == 0) {
|
||||||
cfg->confdetails = (struct confentry **) realloc(cfg->confdetails,
|
cfg->confdetails = (struct confentry **) realloc(cfg->confdetails,
|
||||||
sizeof(struct confentry **) * (MAX_SIZE + cfg->size));
|
sizeof(struct confentry **) * (MAX_SIZE + cfg->size));
|
||||||
|
@ -105,3 +105,12 @@ int get_kv_key(const char *input, char *out, size_t out_len);
|
|||||||
* 0 on success
|
* 0 on success
|
||||||
*/
|
*/
|
||||||
int get_kv_value(const char *input, char *out, size_t out_len);
|
int get_kv_value(const char *input, char *out, size_t out_len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trim whitespace from beginning and end.
|
||||||
|
*
|
||||||
|
* @param input Input string that needs to be trimmed
|
||||||
|
*
|
||||||
|
* @return the trimmed string allocated with malloc. I has to be freed by the caller
|
||||||
|
*/
|
||||||
|
char* trim(char* input);
|
||||||
|
@ -143,7 +143,8 @@ static void assert_valid_setup(char *argv0) {
|
|||||||
int ret;
|
int ret;
|
||||||
char *executable_file = get_executable(argv0);
|
char *executable_file = get_executable(argv0);
|
||||||
if (!executable_file) {
|
if (!executable_file) {
|
||||||
fprintf(ERRORFILE,"realpath of executable: %s\n",strerror(errno));
|
fprintf(ERRORFILE,"realpath of executable: %s\n",
|
||||||
|
errno != 0 ? strerror(errno) : "unknown");
|
||||||
flush_and_close_log_files();
|
flush_and_close_log_files();
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
@ -178,7 +179,7 @@ static void assert_valid_setup(char *argv0) {
|
|||||||
if (group_info == NULL) {
|
if (group_info == NULL) {
|
||||||
free(executable_file);
|
free(executable_file);
|
||||||
fprintf(ERRORFILE, "Can't get group information for %s - %s.\n", nm_group,
|
fprintf(ERRORFILE, "Can't get group information for %s - %s.\n", nm_group,
|
||||||
strerror(errno));
|
errno != 0 ? strerror(errno) : "unknown");
|
||||||
flush_and_close_log_files();
|
flush_and_close_log_files();
|
||||||
exit(INVALID_CONFIG_FILE);
|
exit(INVALID_CONFIG_FILE);
|
||||||
}
|
}
|
||||||
|
@ -565,7 +565,7 @@ void test_list_as_user() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Test with empty dir string
|
// Test with empty dir string
|
||||||
sprintf(buffer, "");
|
strcpy(buffer, "");
|
||||||
int ret = list_as_user(buffer);
|
int ret = list_as_user(buffer);
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
@ -1051,6 +1051,77 @@ void test_dir_permissions() {
|
|||||||
free(container_dir);
|
free(container_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test is used to verify that trim() works correctly
|
||||||
|
*/
|
||||||
|
void test_trim_function() {
|
||||||
|
char* trimmed = NULL;
|
||||||
|
|
||||||
|
printf("\nTesting trim function\n");
|
||||||
|
|
||||||
|
// Check NULL input
|
||||||
|
if (trim(NULL) != NULL) {
|
||||||
|
printf("FAIL: trim(NULL) should be NULL\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check empty input
|
||||||
|
trimmed = trim("");
|
||||||
|
if (strcmp(trimmed, "") != 0) {
|
||||||
|
printf("FAIL: trim(\"\") should be \"\"\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
free(trimmed);
|
||||||
|
|
||||||
|
// Check single space input
|
||||||
|
trimmed = trim(" ");
|
||||||
|
if (strcmp(trimmed, "") != 0) {
|
||||||
|
printf("FAIL: trim(\" \") should be \"\"\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
free(trimmed);
|
||||||
|
|
||||||
|
// Check multi space input
|
||||||
|
trimmed = trim(" ");
|
||||||
|
if (strcmp(trimmed, "") != 0) {
|
||||||
|
printf("FAIL: trim(\" \") should be \"\"\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
free(trimmed);
|
||||||
|
|
||||||
|
// Check both side trim input
|
||||||
|
trimmed = trim(" foo ");
|
||||||
|
if (strcmp(trimmed, "foo") != 0) {
|
||||||
|
printf("FAIL: trim(\" foo \") should be \"foo\"\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
free(trimmed);
|
||||||
|
|
||||||
|
// Check left side trim input
|
||||||
|
trimmed = trim("foo ");
|
||||||
|
if (strcmp(trimmed, "foo") != 0) {
|
||||||
|
printf("FAIL: trim(\"foo \") should be \"foo\"\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
free(trimmed);
|
||||||
|
|
||||||
|
// Check right side trim input
|
||||||
|
trimmed = trim(" foo");
|
||||||
|
if (strcmp(trimmed, "foo") != 0) {
|
||||||
|
printf("FAIL: trim(\" foo\") should be \"foo\"\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
free(trimmed);
|
||||||
|
|
||||||
|
// Check no trim input
|
||||||
|
trimmed = trim("foo");
|
||||||
|
if (strcmp(trimmed, "foo") != 0) {
|
||||||
|
printf("FAIL: trim(\"foo\") should be \"foo\"\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
free(trimmed);
|
||||||
|
}
|
||||||
|
|
||||||
// This test is expected to be executed either by a regular
|
// This test is expected to be executed either by a regular
|
||||||
// user or by root. If executed by a regular user it doesn't
|
// user or by root. If executed by a regular user it doesn't
|
||||||
// test all the functions that would depend on changing the
|
// test all the functions that would depend on changing the
|
||||||
@ -1218,9 +1289,13 @@ int main(int argc, char **argv) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
run("rm -fr " TEST_ROOT);
|
run("rm -fr " TEST_ROOT);
|
||||||
|
|
||||||
|
test_trim_function();
|
||||||
|
|
||||||
printf("\nFinished tests\n");
|
printf("\nFinished tests\n");
|
||||||
|
|
||||||
free(current_username);
|
free(current_username);
|
||||||
free_executor_configurations();
|
free_executor_configurations();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user