#941 Use fixed length strings in og_computer and og_dbi_get_computer_info

This patch is a refactor for og_computer and og_dbi_get_computer_info.
It now uses fixed lenght strings to make it more reliable and avoid
errors if the DB is not returning a null ended string.
master
Roberto Hueso Gómez 2020-10-06 14:19:06 +02:00 committed by OpenGnSys Support Team
parent 27fbc65829
commit f537dafa77
4 changed files with 63 additions and 71 deletions

View File

@ -133,7 +133,6 @@ static int og_resp_hardware(json_t *data, struct og_client *cli)
if (!dbi) { if (!dbi) {
syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
__func__, __LINE__); __func__, __LINE__);
og_dbi_free_computer_info(&computer);
return -1; return -1;
} }
@ -150,7 +149,6 @@ static int og_resp_hardware(json_t *data, struct og_client *cli)
res = actualizaHardware(dbi, legacy.hardware, legacy.id, computer.name, res = actualizaHardware(dbi, legacy.hardware, legacy.id, computer.name,
legacy.center); legacy.center);
og_dbi_close(dbi); og_dbi_close(dbi);
og_dbi_free_computer_info(&computer);
if (!res) { if (!res) {
syslog(LOG_ERR, "Problem updating client configuration\n"); syslog(LOG_ERR, "Problem updating client configuration\n");
@ -203,7 +201,6 @@ static int og_resp_software(json_t *data, struct og_client *cli)
if (!dbi) { if (!dbi) {
syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
__func__, __LINE__); __func__, __LINE__);
og_dbi_free_computer_info(&computer);
return -1; return -1;
} }
@ -221,7 +218,6 @@ static int og_resp_software(json_t *data, struct og_client *cli)
res = actualizaSoftware(dbi, legacy.software, legacy.part, legacy.id, res = actualizaSoftware(dbi, legacy.software, legacy.part, legacy.id,
computer.name, legacy.center); computer.name, legacy.center);
og_dbi_close(dbi); og_dbi_close(dbi);
og_dbi_free_computer_info(&computer);
if (!res) { if (!res) {
syslog(LOG_ERR, "Problem updating client configuration\n"); syslog(LOG_ERR, "Problem updating client configuration\n");
@ -351,7 +347,6 @@ static int og_resp_refresh(json_t *data, struct og_client *cli)
if (!dbi) { if (!dbi) {
syslog(LOG_ERR, "cannot open connection database (%s:%d)\n", syslog(LOG_ERR, "cannot open connection database (%s:%d)\n",
__func__, __LINE__); __func__, __LINE__);
og_dbi_free_computer_info(&computer);
return -1; return -1;
} }
@ -366,19 +361,15 @@ static int og_resp_refresh(json_t *data, struct og_client *cli)
if (!res) { if (!res) {
syslog(LOG_ERR, "Problem updating client configuration\n"); syslog(LOG_ERR, "Problem updating client configuration\n");
og_dbi_free_computer_info(&computer);
return -1; return -1;
} }
if (!cli->autorun && computer.procedure_id) { if (!cli->autorun && computer.procedure_id) {
cli->autorun = true; cli->autorun = true;
if (og_dbi_queue_autorun(computer.id, computer.procedure_id)) { if (og_dbi_queue_autorun(computer.id, computer.procedure_id))
og_dbi_free_computer_info(&computer);
return -1; return -1;
}
} }
og_dbi_free_computer_info(&computer);
return 0; return 0;
} }
@ -502,12 +493,10 @@ static int og_resp_image_create(json_t *data, struct og_client *cli)
computer.name, computer.name,
soft_legacy.center); soft_legacy.center);
if (!res) { if (!res) {
og_dbi_free_computer_info(&computer);
og_dbi_close(dbi); og_dbi_close(dbi);
syslog(LOG_ERR, "Problem updating client configuration\n"); syslog(LOG_ERR, "Problem updating client configuration\n");
return -1; return -1;
} }
og_dbi_free_computer_info(&computer);
res = actualizaCreacionImagen(dbi, res = actualizaCreacionImagen(dbi,
img_legacy.image_id, img_legacy.image_id,
@ -609,8 +598,6 @@ static int og_resp_image_restore(json_t *data, struct og_client *cli)
snprintf(img_legacy.disk, sizeof(img_legacy.disk), "%s", disk); snprintf(img_legacy.disk, sizeof(img_legacy.disk), "%s", disk);
snprintf(soft_legacy.id, sizeof(soft_legacy.id), "%d", computer.id); snprintf(soft_legacy.id, sizeof(soft_legacy.id), "%d", computer.id);
og_dbi_free_computer_info(&computer);
res = actualizaRestauracionImagen(dbi, res = actualizaRestauracionImagen(dbi,
img_legacy.image_id, img_legacy.image_id,
img_legacy.disk, img_legacy.disk,

View File

@ -13,6 +13,7 @@
#include "dbi.h" #include "dbi.h"
#include <syslog.h> #include <syslog.h>
#include <string.h> #include <string.h>
#include <stdio.h>
struct og_dbi *og_dbi_open(struct og_dbi_config *config) struct og_dbi *og_dbi_open(struct og_dbi_config *config)
{ {
@ -93,19 +94,28 @@ int og_dbi_get_computer_info(struct og_dbi *dbi, struct og_computer *computer,
} }
computer->id = dbi_result_get_uint(result, "idordenador"); computer->id = dbi_result_get_uint(result, "idordenador");
computer->name = strdup(dbi_result_get_string(result, "nombreordenador")); snprintf(computer->name, sizeof(computer->name), "%s",
computer->serial_number = strdup(dbi_result_get_string(result, "numserie")); dbi_result_get_string(result, "nombreordenador"));
computer->ip = strdup(dbi_result_get_string(result, "ip")); snprintf(computer->serial_number, sizeof(computer->serial_number), "%s",
computer->mac = strdup(dbi_result_get_string(result, "mac")); dbi_result_get_string(result, "numserie"));
snprintf(computer->ip, sizeof(computer->ip), "%s",
dbi_result_get_string(result, "ip"));
snprintf(computer->mac, sizeof(computer->mac), "%s",
dbi_result_get_string(result, "mac"));
computer->room = dbi_result_get_uint(result, "idaula"); computer->room = dbi_result_get_uint(result, "idaula");
computer->hardware_id = dbi_result_get_uint(result, "idperfilhard"); computer->hardware_id = dbi_result_get_uint(result, "idperfilhard");
computer->repo_id = dbi_result_get_uint(result, "idrepositorio"); computer->repo_id = dbi_result_get_uint(result, "idrepositorio");
computer->netmask = strdup(dbi_result_get_string(result, "mascara")); snprintf(computer->netmask, sizeof(computer->netmask), "%s",
computer->boot = strdup(dbi_result_get_string(result, "arranque")); dbi_result_get_string(result, "mascara"));
computer->netiface = strdup(dbi_result_get_string(result, "netiface")); snprintf(computer->boot, sizeof(computer->boot), "%s",
computer->netdriver = strdup(dbi_result_get_string(result, "netdriver")); dbi_result_get_string(result, "arranque"));
snprintf(computer->netiface, sizeof(computer->netiface), "%s",
dbi_result_get_string(result, "netiface"));
snprintf(computer->netdriver, sizeof(computer->netdriver), "%s",
dbi_result_get_string(result, "netdriver"));
computer->procedure_id = dbi_result_get_uint(result, "idproautoexec"); computer->procedure_id = dbi_result_get_uint(result, "idproautoexec");
computer->livedir = strdup(dbi_result_get_string(result, "oglivedir")); snprintf(computer->livedir, sizeof(computer->livedir), "%s",
dbi_result_get_string(result, "oglivedir"));
computer->remote = dbi_result_get_uint(result, "inremotepc") != 0; computer->remote = dbi_result_get_uint(result, "inremotepc") != 0;
computer->maintenance = dbi_result_get_uint(result, "maintenance") != 0; computer->maintenance = dbi_result_get_uint(result, "maintenance") != 0;
@ -113,16 +123,3 @@ int og_dbi_get_computer_info(struct og_dbi *dbi, struct og_computer *computer,
return 0; return 0;
} }
void og_dbi_free_computer_info(struct og_computer *computer)
{
free(computer->serial_number);
free(computer->netdriver);
free(computer->netiface);
free(computer->netmask);
free(computer->livedir);
free(computer->name);
free(computer->boot);
free(computer->mac);
free(computer->ip);
}

View File

@ -23,10 +23,16 @@ void og_dbi_close(struct og_dbi *db);
#define OG_DB_COMPUTER_NAME_MAXLEN 100 #define OG_DB_COMPUTER_NAME_MAXLEN 100
#define OG_DB_CENTER_NAME_MAXLEN 100 #define OG_DB_CENTER_NAME_MAXLEN 100
#define OG_DB_ROOM_NAME_MAXLEN 100 #define OG_DB_ROOM_NAME_MAXLEN 100
#define OG_DB_SERIAL_NUMBER_MAXLEN 25
#define OG_DB_IMAGE_NAME_MAXLEN 50 #define OG_DB_IMAGE_NAME_MAXLEN 50
#define OG_DB_FILESYSTEM_MAXLEN 16 #define OG_DB_FILESYSTEM_MAXLEN 16
#define OG_DB_NETDRIVER_MAXLEN 30
#define OG_DB_NETIFACE_MAXLEN 4
#define OG_DB_LIVEDIR_MAXLEN 50
#define OG_DB_INT8_MAXLEN 8 #define OG_DB_INT8_MAXLEN 8
#define OG_DB_BOOT_MAXLEN 30
#define OG_DB_INT_MAXLEN 11 #define OG_DB_INT_MAXLEN 11
#define OG_DB_MAC_MAXLEN 15
#define OG_DB_IP_MAXLEN 15 #define OG_DB_IP_MAXLEN 15
#define OG_DB_SMALLINT_MAXLEN 6 #define OG_DB_SMALLINT_MAXLEN 6
@ -59,20 +65,19 @@ struct og_computer {
unsigned int id; unsigned int id;
bool maintenance; bool maintenance;
bool remote; bool remote;
char *serial_number; char serial_number[OG_DB_SERIAL_NUMBER_MAXLEN + 1];
char *netdriver; char netdriver[OG_DB_NETDRIVER_MAXLEN + 1];
char *netiface; char name[OG_DB_COMPUTER_NAME_MAXLEN + 1];
char *netmask; char netiface[OG_DB_NETIFACE_MAXLEN + 1];
char *livedir; char livedir[OG_DB_LIVEDIR_MAXLEN + 1];
char *name; char netmask[OG_DB_IP_MAXLEN + 1];
char *boot; char boot[OG_DB_BOOT_MAXLEN + 1];
char *mac; char mac[OG_DB_MAC_MAXLEN + 1];
char *ip; char ip[OG_DB_IP_MAXLEN + 1];
}; };
struct in_addr; struct in_addr;
int og_dbi_get_computer_info(struct og_dbi *dbi, struct og_computer *computer, int og_dbi_get_computer_info(struct og_dbi *dbi, struct og_computer *computer,
struct in_addr addr); struct in_addr addr);
void og_dbi_free_computer_info(struct og_computer *computer);
#endif #endif

View File

@ -1214,7 +1214,6 @@ static int og_cmd_get_client_info(json_t *element,
json_object_set_new(root, "id", json_integer(computer.id)); json_object_set_new(root, "id", json_integer(computer.id));
json_object_set_new(root, "ip", json_string(computer.ip)); json_object_set_new(root, "ip", json_string(computer.ip));
og_dbi_free_computer_info(&computer);
json_dump_callback(root, og_json_dump_clients, &og_buffer, 0); json_dump_callback(root, og_json_dump_clients, &og_buffer, 0);
json_decref(root); json_decref(root);
return 0; return 0;
@ -1224,8 +1223,8 @@ static int og_cmd_post_client_add(json_t *element,
struct og_msg_params *params, struct og_msg_params *params,
char *buffer_reply) char *buffer_reply)
{ {
const char *key, *str, *msglog;
struct og_computer computer = {}; struct og_computer computer = {};
const char *key, *msglog;
struct og_dbi *dbi; struct og_dbi *dbi;
dbi_result result; dbi_result result;
json_t *value; json_t *value;
@ -1233,42 +1232,51 @@ static int og_cmd_post_client_add(json_t *element,
json_object_foreach(element, key, value) { json_object_foreach(element, key, value) {
if (!strcmp(key, "serial_number")) { if (!strcmp(key, "serial_number")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.serial_number = strdup(str); computer.serial_number,
sizeof(computer.serial_number));
} else if (!strcmp(key, "hardware_id")) { } else if (!strcmp(key, "hardware_id")) {
err = og_json_parse_uint(value, &computer.hardware_id); err = og_json_parse_uint(value, &computer.hardware_id);
} else if (!strcmp(key, "netdriver")) { } else if (!strcmp(key, "netdriver")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.netdriver = strdup(str); computer.netdriver,
sizeof(computer.netdriver));
} else if (!strcmp(key, "maintenance")) { } else if (!strcmp(key, "maintenance")) {
err = og_json_parse_bool(value, &computer.maintenance); err = og_json_parse_bool(value, &computer.maintenance);
} else if (!strcmp(key, "netiface")) { } else if (!strcmp(key, "netiface")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.netiface = strdup(str); computer.netiface,
sizeof(computer.netiface));
} else if (!strcmp(key, "repo_id")) { } else if (!strcmp(key, "repo_id")) {
err = og_json_parse_uint(value, &computer.repo_id); err = og_json_parse_uint(value, &computer.repo_id);
} else if (!strcmp(key, "livedir")) { } else if (!strcmp(key, "livedir")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.livedir = strdup(str); computer.livedir,
sizeof(computer.livedir));
} else if (!strcmp(key, "netmask")) { } else if (!strcmp(key, "netmask")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.netmask = strdup(str); computer.netmask,
sizeof(computer.netmask));
} else if (!strcmp(key, "remote")) { } else if (!strcmp(key, "remote")) {
err = og_json_parse_bool(value, &computer.remote); err = og_json_parse_bool(value, &computer.remote);
} else if (!strcmp(key, "room")) { } else if (!strcmp(key, "room")) {
err = og_json_parse_uint(value, &computer.room); err = og_json_parse_uint(value, &computer.room);
} else if (!strcmp(key, "name")) { } else if (!strcmp(key, "name")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.name = strdup(str); computer.name,
sizeof(computer.name));
} else if (!strcmp(key, "boot")) { } else if (!strcmp(key, "boot")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.boot = strdup(str); computer.boot,
sizeof(computer.boot));
} else if (!strcmp(key, "mac")) { } else if (!strcmp(key, "mac")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.mac = strdup(str); computer.mac,
sizeof(computer.mac));
} else if (!strcmp(key, "ip")) { } else if (!strcmp(key, "ip")) {
err = og_json_parse_string(value, &str); err = og_json_parse_string_copy(value,
computer.ip = strdup(str); computer.ip,
sizeof(computer.ip));
} }
if (err < 0) if (err < 0)
@ -1279,7 +1287,6 @@ static int og_cmd_post_client_add(json_t *element,
if (!dbi) { if (!dbi) {
syslog(LOG_ERR, "cannot open conection database (%s:%d)\n", syslog(LOG_ERR, "cannot open conection database (%s:%d)\n",
__func__, __LINE__); __func__, __LINE__);
og_dbi_free_computer_info(&computer);
return -1; return -1;
} }
@ -1292,7 +1299,6 @@ static int og_cmd_post_client_add(json_t *element,
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
__func__, __LINE__, msglog); __func__, __LINE__, msglog);
og_dbi_close(dbi); og_dbi_close(dbi);
og_dbi_free_computer_info(&computer);
return -1; return -1;
} }
@ -1301,7 +1307,6 @@ static int og_cmd_post_client_add(json_t *element,
computer.ip); computer.ip);
dbi_result_free(result); dbi_result_free(result);
og_dbi_close(dbi); og_dbi_close(dbi);
og_dbi_free_computer_info(&computer);
return -1; return -1;
} }
dbi_result_free(result); dbi_result_free(result);
@ -1338,13 +1343,11 @@ static int og_cmd_post_client_add(json_t *element,
syslog(LOG_ERR, "failed to add client to database (%s:%d) %s\n", syslog(LOG_ERR, "failed to add client to database (%s:%d) %s\n",
__func__, __LINE__, msglog); __func__, __LINE__, msglog);
og_dbi_close(dbi); og_dbi_close(dbi);
og_dbi_free_computer_info(&computer);
return -1; return -1;
} }
dbi_result_free(result); dbi_result_free(result);
og_dbi_close(dbi); og_dbi_close(dbi);
og_dbi_free_computer_info(&computer);
return 0; return 0;
} }