host/mobile: use talloc for ms->name allocation
The approach of talloc memory management reduces memory usage, and prevents some buffer overflows, which were possible before. Change-Id: Icd6706117fdd7f1b3481b0e3817bbb3b31f12f60
This commit is contained in:
parent
c1cdd3b5a4
commit
064ffe6563
|
@ -57,7 +57,7 @@ struct rx_meas_stat {
|
|||
/* One Mobilestation for osmocom */
|
||||
struct osmocom_ms {
|
||||
struct llist_head entity;
|
||||
char name[32];
|
||||
char *name;
|
||||
struct osmo_wqueue l2_wq, sap_wq;
|
||||
uint16_t test_arfcn;
|
||||
struct osmol1_entity l1_entity;
|
||||
|
|
|
@ -246,8 +246,7 @@ int main(int argc, char **argv)
|
|||
|
||||
llist_add_tail(&ms->entity, &ms_list);
|
||||
|
||||
sprintf(ms->name, "1");
|
||||
|
||||
ms->name = talloc_strdup(ms, "1");
|
||||
ms->test_arfcn = 871;
|
||||
|
||||
handle_options(argc, argv);
|
||||
|
|
|
@ -248,32 +248,34 @@ int mobile_init(struct osmocom_ms *ms)
|
|||
struct osmocom_ms *mobile_new(char *name)
|
||||
{
|
||||
static struct osmocom_ms *ms;
|
||||
char *mncc_name;
|
||||
|
||||
ms = talloc_zero(l23_ctx, struct osmocom_ms);
|
||||
if (!ms) {
|
||||
fprintf(stderr, "Failed to allocate MS\n");
|
||||
return NULL;
|
||||
}
|
||||
llist_add_tail(&ms->entity, &ms_list);
|
||||
|
||||
strcpy(ms->name, name);
|
||||
|
||||
talloc_set_name(ms, "ms_%s", name);
|
||||
ms->name = talloc_strdup(ms, name);
|
||||
ms->l2_wq.bfd.fd = -1;
|
||||
ms->sap_wq.bfd.fd = -1;
|
||||
|
||||
/* Register a new MS */
|
||||
llist_add_tail(&ms->entity, &ms_list);
|
||||
|
||||
gsm_support_init(ms);
|
||||
gsm_settings_init(ms);
|
||||
|
||||
ms->shutdown = 3; /* being down */
|
||||
|
||||
if (mncc_recv_app) {
|
||||
char name[32];
|
||||
|
||||
sprintf(name, "/tmp/ms_mncc_%s", ms->name);
|
||||
mncc_name = talloc_asprintf(ms, "/tmp/ms_mncc_%s", ms->name);
|
||||
|
||||
ms->mncc_entity.mncc_recv = mncc_recv_app;
|
||||
ms->mncc_entity.sock_state = mncc_sock_init(ms, name, l23_ctx);
|
||||
ms->mncc_entity.sock_state = mncc_sock_init(ms, mncc_name, l23_ctx);
|
||||
|
||||
talloc_free(mncc_name);
|
||||
} else if (ms->settings.ch_cap == GSM_CAP_SDCCH)
|
||||
ms->mncc_entity.mncc_recv = mncc_recv_dummy;
|
||||
else
|
||||
|
|
|
@ -5028,7 +5028,7 @@ int gsm322_init(struct osmocom_ms *ms)
|
|||
struct gsm322_plmn *plmn = &ms->plmn;
|
||||
struct gsm322_cellsel *cs = &ms->cellsel;
|
||||
FILE *fp;
|
||||
char filename[PATH_MAX];
|
||||
char *ba_filename;
|
||||
int i;
|
||||
struct gsm322_ba_list *ba;
|
||||
uint8_t buf[4];
|
||||
|
@ -5060,8 +5060,9 @@ int gsm322_init(struct osmocom_ms *ms)
|
|||
cs->list[i].flags |= GSM322_CS_FLAG_SUPPORT;
|
||||
|
||||
/* read BA list */
|
||||
sprintf(filename, "%s/%s.ba", config_dir, ms->name);
|
||||
fp = fopen(filename, "r");
|
||||
ba_filename = talloc_asprintf(ms, "%s/%s.ba", config_dir, ms->name);
|
||||
fp = fopen(ba_filename, "r");
|
||||
talloc_free(ba_filename);
|
||||
if (fp) {
|
||||
int rc;
|
||||
char *s_rc;
|
||||
|
@ -5108,7 +5109,7 @@ int gsm322_exit(struct osmocom_ms *ms)
|
|||
struct llist_head *lh, *lh2;
|
||||
struct msgb *msg;
|
||||
FILE *fp;
|
||||
char filename[PATH_MAX];
|
||||
char *ba_filename;
|
||||
struct gsm322_ba_list *ba;
|
||||
uint8_t buf[4];
|
||||
int rc = 0;
|
||||
|
@ -5137,20 +5138,23 @@ int gsm322_exit(struct osmocom_ms *ms)
|
|||
}
|
||||
|
||||
/* store BA list */
|
||||
sprintf(filename, "%s/%s.ba", config_dir, ms->name);
|
||||
fp = fopen(filename, "w");
|
||||
if (fp) {
|
||||
fputs(ba_version, fp);
|
||||
llist_for_each_entry(ba, &cs->ba_list, entry) {
|
||||
buf[0] = ba->mcc >> 8;
|
||||
buf[1] = ba->mcc & 0xff;
|
||||
buf[2] = ba->mnc >> 8;
|
||||
buf[3] = ba->mnc & 0xff;
|
||||
ba_filename = talloc_asprintf(ms, "%s/%s.ba", config_dir, ms->name);
|
||||
if (ba_filename) {
|
||||
fp = fopen(ba_filename, "w");
|
||||
talloc_free(ba_filename);
|
||||
if (fp) {
|
||||
fputs(ba_version, fp);
|
||||
llist_for_each_entry(ba, &cs->ba_list, entry) {
|
||||
buf[0] = ba->mcc >> 8;
|
||||
buf[1] = ba->mcc & 0xff;
|
||||
buf[2] = ba->mnc >> 8;
|
||||
buf[3] = ba->mnc & 0xff;
|
||||
|
||||
rc += fwrite(buf, 4, 1, fp);
|
||||
rc += fwrite(ba->freq, sizeof(ba->freq), 1, fp);
|
||||
rc += fwrite(buf, 4, 1, fp);
|
||||
rc += fwrite(ba->freq, sizeof(ba->freq), 1, fp);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (rc == 2)
|
||||
|
|
|
@ -1265,7 +1265,7 @@ DEFUN(cfg_ms_rename, cfg_ms_rename_cmd, "ms MS_NAME rename MS_NAME",
|
|||
return CMD_WARNING;
|
||||
}
|
||||
|
||||
strncpy(ms->name, argv[1], sizeof(ms->name) - 1);
|
||||
osmo_talloc_replace_string(ms, &ms->name, argv[1]);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue