Ticket refs #6892: Parameters used for pathname reference cannot be set to empty

This commit is contained in:
Amin Ben Ramdhane 2021-12-29 16:45:33 +01:00
parent 29f8051364
commit c3ea9e5597
34 changed files with 469 additions and 459 deletions

View file

@ -64,18 +64,14 @@ void set_diagnostics_interface_option(struct dmctx *ctx, char *sec_name, char *v
{
char *linker = NULL;
if (value[0] == 0)
if (!value)
return;
if (strncmp(value, "Device.IP.Interface.", 20) != 0)
if (*value && strncmp(value, "Device.IP.Interface.", 20) != 0)
return;
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
set_diagnostics_option(sec_name, "interface", linker);
dmfree(linker);
}
set_diagnostics_option(sec_name, "interface", linker ? linker : "");
}
static bool get_response_code_status(const char *url, int response_code)

View file

@ -361,9 +361,13 @@ int dm_entry_apply(struct dmctx *ctx, int cmd, char *arg1)
int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value)
{
struct dmctx dmctx = {0};
*value = "";
if (!param || !linker)
return 0;
dm_ctx_init_sub(&dmctx, ctx->instance_mode);
dmctx.in_param = param ? param : "";
dmctx.in_param = param;
dmctx.linker = linker;
dm_entry_get_linker(&dmctx);
@ -394,6 +398,28 @@ int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value)
return 0;
}
int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *objects[])
{
if (!value || !objects)
return -1;
if (*value == '\0')
return 0;
for (; *objects; objects++) {
if (strncmp(value, *objects, strlen(*objects)) == 0) {
char *linker = NULL;
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker)
return 0;
}
}
return -1;
}
int dm_entry_manage_services(struct blob_buf *bb, bool restart)
{
struct package_change *pc = NULL;

View file

@ -33,8 +33,7 @@ static int get_voice_service_callcontrol_linker(char *refparam, struct dmctx *dm
**************************************************************/
static int set_CallControl_Line(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char callcontrol_line[64] = "Device.Services.VoiceService.1.CallControl.Line.";
size_t line_len = strlen(callcontrol_line);
char *allowed_objects[] = {"Device.Services.VoiceService.1.CallControl.Line.", NULL};
char *linker = NULL;
switch (action) {
@ -42,16 +41,13 @@ static int set_CallControl_Line(char *refparam, struct dmctx *ctx, void *data, c
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (strncmp(value, callcontrol_line, line_len) != 0)
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "line", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "line", linker ? linker : "");
break;
}
return 0;
@ -59,8 +55,7 @@ static int set_CallControl_Line(char *refparam, struct dmctx *ctx, void *data, c
static int set_CallControl_Group(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char callcontrol_extension[64] = "Device.Services.VoiceService.1.CallControl.Group.";
size_t extension_len = strlen(callcontrol_extension);
char *allowed_objects[] = {"Device.Services.VoiceService.1.CallControl.Group.", NULL};
char *linker = NULL;
switch (action) {
@ -68,16 +63,13 @@ static int set_CallControl_Group(char *refparam, struct dmctx *ctx, void *data,
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (strncmp(value, callcontrol_extension, extension_len) != 0)
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "extension", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "extension", linker ? linker : "");
break;
}
return 0;
@ -85,8 +77,7 @@ static int set_CallControl_Group(char *refparam, struct dmctx *ctx, void *data,
static int set_CallControl_CallingFeaturesSet(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char feature_set[64] = "Device.Services.VoiceService.1.CallControl.CallingFeatures.Set.";
size_t set_len = strlen(feature_set);
char *allowed_objects[] = {"Device.Services.VoiceService.1.CallControl.CallingFeatures.Set.", NULL};
char *linker = NULL;
switch (action) {
@ -94,16 +85,13 @@ static int set_CallControl_CallingFeaturesSet(char *refparam, struct dmctx *ctx,
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (strncmp(value, feature_set, set_len) != 0)
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "calling_features", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "calling_features", linker ? linker : "");
break;
}
return 0;
@ -111,8 +99,7 @@ static int set_CallControl_CallingFeaturesSet(char *refparam, struct dmctx *ctx,
static int set_SIP_Client(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char sip_client[64] = "Device.Services.VoiceService.1.SIP.Client.";
size_t client_len = strlen(sip_client);
char *allowed_objects[] = {"Device.Services.VoiceService.1.SIP.Client.", NULL};
char *linker = NULL;
switch (action) {
@ -120,16 +107,13 @@ static int set_SIP_Client(char *refparam, struct dmctx *ctx, void *data, char *i
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (strncmp(value, sip_client, client_len) != 0)
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "provider", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "provider", linker ? linker : "");
break;
}
return 0;
@ -610,8 +594,6 @@ static int get_ServicesVoiceServiceCallControlLine_Provider(char *refparam, stru
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "provider", &linker);
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -627,8 +609,6 @@ static int get_ServicesVoiceServiceCallControlLine_CallingFeatures(char *refpara
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "calling_features", &linker);
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -668,8 +648,6 @@ static int get_ServicesVoiceServiceCallControlIncomingMap_Line(char *refparam, s
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "line", &linker);
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -707,8 +685,6 @@ static int get_ServicesVoiceServiceCallControlIncomingMap_Extension(char *refpar
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "extension", &linker);
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -769,8 +745,6 @@ static int get_ServicesVoiceServiceCallControlOutgoingMap_Line(char *refparam, s
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "line", &linker);
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -786,8 +760,6 @@ static int get_ServicesVoiceServiceCallControlOutgoingMap_Extension(char *refpar
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "extension", &linker);
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -813,7 +785,7 @@ static int get_ServicesVoiceServiceCallControlGroup_Extensions(char *refparam, s
char *linker = NULL;
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", e->name, &linker);
if (linker)
if (linker && *linker)
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s,", linker);
}
@ -827,8 +799,7 @@ static int get_ServicesVoiceServiceCallControlGroup_Extensions(char *refparam, s
static int set_ServicesVoiceServiceCallControlGroup_Extensions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char callcontrol_extension[64] = "Device.Services.VoiceService.1.CallControl.Extension.";
size_t extension_len = strlen(callcontrol_extension);
char *allowed_objects[] = {"Device.Services.VoiceService.1.CallControl.Extension.", NULL};
char *pch = NULL, *spch = NULL;
char value_buf[512] = {0};
@ -840,13 +811,8 @@ static int set_ServicesVoiceServiceCallControlGroup_Extensions(char *refparam, s
return FAULT_9007;
for (pch = strtok_r(value_buf, ",", &spch); pch != NULL; pch = strtok_r(NULL, ",", &spch)) {
char *linker = NULL;
if (strncmp(pch, callcontrol_extension, extension_len) != 0)
return FAULT_9007;
adm_entry_get_linker_value(ctx, pch, &linker);
if (linker == NULL)
if (dm_entry_validate_allowed_objects(ctx, pch, allowed_objects))
return FAULT_9007;
}
@ -920,17 +886,18 @@ static int get_ServicesVoiceServiceCallControlExtension_Provider(char *refparam,
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "provider", &provider_string);
if (strlen(provider_string)) {
unsigned pos = 0;
char *ptr = NULL, *spch = NULL;
char *ptr = NULL, *spch = NULL;
buf[0] = 0;
char *provider = dmstrdup(provider_string);
ptr = strtok_r(provider, ",", &spch);
while(ptr != NULL){
char *provider = dmstrdup(provider_string);
ptr = strtok_r(provider, ",", &spch);
while (ptr != NULL) {
char *linker = NULL;
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", !strcmp(type, "fxs") ? section_name(((struct dmmap_dup *)data)->config_section) : ptr, &linker);
if (linker)
if (linker && *linker)
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s,", linker);
ptr = strtok_r(NULL, ",", &spch);
ptr = strtok_r(NULL, ",", &spch);
}
if (pos)
@ -950,8 +917,9 @@ static int set_ServicesVoiceServiceCallControlExtension_Provider(char *refparam,
char *pch = NULL, *spch = NULL;
char value_buf[512] = {0};
char *type;
char buf[512] = {0};
unsigned pos = 0;
char buf[512] = {0};
unsigned pos = 0;
DM_STRNCPY(value_buf, value, sizeof(value_buf));
switch (action) {
@ -959,6 +927,9 @@ static int set_ServicesVoiceServiceCallControlExtension_Provider(char *refparam,
if (dm_validate_string_list(value_buf, -1, -1, -1, -1, -1, NULL, NULL))
return FAULT_9007;
if (value_buf[0] == 0)
break;
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "type", &type);
for (pch = strtok_r(value_buf, ",", &spch); pch != NULL; pch = strtok_r(NULL, ",", &spch)) {
@ -977,15 +948,17 @@ static int set_ServicesVoiceServiceCallControlExtension_Provider(char *refparam,
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "provider", "");
for (pch = strtok_r(value_buf, ",", &spch); pch != NULL; pch = strtok_r(NULL, ",", &spch)) {
char *linker = NULL;
if(pos != 0)
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s", ",");
if (pos != 0)
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s", ",");
adm_entry_get_linker_value(ctx, pch, &linker);
if(!strcmp(linker, "extension3"))
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s", "fxs1");
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s", "fxs1");
else if(!strcmp(linker, "extension4"))
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s", "fxs2");
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s", "fxs2");
else
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s", linker);
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s", linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "provider", buf);
break;
@ -1000,8 +973,6 @@ static int get_ServicesVoiceServiceCallControlExtension_CallingFeatures(char *re
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "calling_features", &linker);
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -18,12 +18,10 @@
/*#Device.Services.VoiceService.{i}.CodecProfile.{i}.Codec!UCI:asterisk/codec_profile,@i-1/name*/
static int get_ServicesVoiceServiceCodecProfile_Codec(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *linker;
char *linker = NULL;
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "name", &linker);
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -58,17 +58,21 @@ static int get_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data,
{
char *linker = get_diagnostics_option("ipping", "interface");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
IPPING_STOP
@ -291,17 +295,21 @@ static int get_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *c
{
char *linker = get_diagnostics_option("traceroute", "interface");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
TRACEROUTE_STOP
@ -533,18 +541,22 @@ static int set_IPDiagnosticsDownloadDiagnostics_DiagnosticsState(char *refparam,
static int get_IPDiagnosticsDownloadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *linker = get_diagnostics_option("download", "interface");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
if (*value == NULL)
*value = "";
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
return 0;
}
static int set_IPDiagnosticsDownloadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
DOWNLOAD_DIAGNOSTIC_STOP
@ -859,18 +871,22 @@ static int set_IPDiagnosticsUploadDiagnostics_DiagnosticsState(char *refparam, s
static int get_IPDiagnosticsUploadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *linker = get_diagnostics_option("upload", "interface");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
if (*value == NULL)
*value = "";
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
return 0;
}
static int set_IPDiagnosticsUploadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
UPLOAD_DIAGNOSTIC_STOP
@ -1203,17 +1219,21 @@ static int get_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct
{
char *linker = get_diagnostics_option("udpechodiag", "interface");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
UDPECHO_STOP;
@ -1462,17 +1482,21 @@ static int get_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam,
{
char *linker = get_diagnostics_option("serverselection", "interface");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
SERVERSELECTION_STOP

View file

@ -269,8 +269,7 @@ static int get_atm_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch
char atm_file[128];
dmuci_get_value_by_section_string((((struct atm_args *)data)->sections)->dmmap_section, "atm_ll_link", &linker);
if (linker != NULL)
adm_entry_get_linker_param(ctx, "Device.DSL.Channel.", linker, value);
adm_entry_get_linker_param(ctx, "Device.DSL.Channel.", linker, value);
if (*value != NULL && (*value)[0] != '\0')
return 0;

View file

@ -975,7 +975,7 @@ static void remove_vlanid_from_ifname_list(struct uci_section *bridge_sec, char
}
}
static void set_lowerlayers_management_port(struct dmctx *ctx, void *data, char *value)
static int set_lowerlayers_management_port(struct dmctx *ctx, void *data, char *value)
{
char *pch = NULL, *spch = NULL, new_device[1024] = { 0, 0 };
unsigned pos = 0;
@ -994,6 +994,8 @@ static void set_lowerlayers_management_port(struct dmctx *ctx, void *data, char
continue;
pos += snprintf(&new_device[pos], sizeof(new_device) - pos, "%s,", linker);
} else {
return FAULT_9007;
}
}
@ -1001,6 +1003,7 @@ static void set_lowerlayers_management_port(struct dmctx *ctx, void *data, char
new_device[pos - 1] = 0;
dmuci_set_value_by_section(((struct bridge_port_args *)data)->bridge_port_dmmap_sec, "port", new_device);
return 0;
}
static void update_device_management_port(char *old_name, char *new_name, char *br_inst)
@ -2167,7 +2170,8 @@ static int get_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx,
lbuf[0] = 0;
for (pch = strtok_r(port_device, ",", &spch); pch != NULL; pch = strtok_r(NULL, ",", &spch)) {
adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", pch, value);
pos += snprintf(&lbuf[pos], sizeof(lbuf) - pos, "%s,", *value ? *value : "");
if (*value && (*value)[0] != 0)
pos += snprintf(&lbuf[pos], sizeof(lbuf) - pos, "%s,", *value);
}
if (pos)
@ -2185,21 +2189,24 @@ static int get_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx,
}
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", port_device ? port_device : "", value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", port_device ? port_device : "", value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.ATM.Link.", port_device ? port_device : "", value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.PTM.Link.", port_device ? port_device : "", value);
if (*value == NULL)
*value = "";
}
return 0;
}
static int set_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {
"Device.Ethernet.Interface.",
"Device.WiFi.SSID.",
"Device.ATM.Link.",
"Device.PTM.Link.",
NULL};
char *management = NULL, *linker = NULL;
dmuci_get_value_by_section_string(((struct bridge_port_args *)data)->bridge_port_dmmap_sec, "management", &management);
@ -2212,27 +2219,25 @@ static int set_BridgingBridgePort_LowerLayers(char *refparam, struct dmctx *ctx,
if (management && strcmp(management, "1") == 0)
break;
if (strncmp(value, "Device.Ethernet.Interface.", 26) != 0 &&
strncmp(value, "Device.WiFi.SSID.", 17) != 0 &&
strncmp(value, "Device.ATM.Link.", 16) != 0 &&
strncmp(value, "Device.PTM.Link.", 16) != 0)
return FAULT_9007;
adm_entry_get_linker_value(ctx, value, &linker);
if (linker == NULL || *linker == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
if (management && strcmp(management, "1") == 0) {
/* Management Port ==> true */
set_lowerlayers_management_port(ctx, data, value);
return set_lowerlayers_management_port(ctx, data, value);
} else {
/* Management Port ==> false */
bool is_wireless_config = false;
adm_entry_get_linker_value(ctx, value, &linker);
if (!linker || *linker == 0) {
dmuci_set_value_by_section(((struct bridge_port_args *)data)->bridge_port_dmmap_sec, "port", "");
return 0;
}
// Update config section on dmmap_bridge_port if the linker is wirelss port or network port
if (strncmp(value, "Device.WiFi.SSID.", 17) == 0) {
dmuci_set_value_by_section(((struct bridge_port_args *)data)->bridge_port_dmmap_sec, "config", "wireless");
@ -2770,23 +2775,28 @@ static int get_BridgingBridgeVLANPort_VLAN(char *refparam, struct dmctx *ctx, vo
/* Get linker */
snprintf(linker, sizeof(linker),"br_%s:vlan_%s", ((struct bridge_vlanport_args *)data)->br_inst, vid);
adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_BridgingBridgeVLANPort_VLAN(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char lower_layer_path[256] = {0};
char *allowed_objects[] = {
lower_layer_path,
NULL};
snprintf(lower_layer_path, sizeof(lower_layer_path), "Device.Bridging.Bridge.%s.VLAN.", ((struct bridge_vlanport_args *)data)->br_inst);
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
snprintf(lower_layer_path, sizeof(lower_layer_path), "Device.Bridging.Bridge.%s.VLAN.", ((struct bridge_vlanport_args *)data)->br_inst);
/* Check the path object is correct or no */
if (strncmp(value, lower_layer_path, strlen(lower_layer_path)) == 0) {
/* Check linker exist */
@ -2878,25 +2888,29 @@ static int get_BridgingBridgeVLANPort_Port(char *refparam, struct dmctx *ctx, vo
dmuci_get_value_by_section_string(((struct bridge_vlanport_args *)data)->bridge_vlanport_dmmap_sec, "port_name", &port_name);
snprintf(linker, sizeof(linker), "br_%s:%s+%s", ((struct bridge_vlanport_args *)data)->br_inst, port_name, name);
adm_entry_get_linker_param(ctx, "Device.Bridging.Bridge.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_BridgingBridgeVLANPort_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char lower_layer_path[256] = {0};
char *allowed_objects[] = {
lower_layer_path,
NULL};
snprintf(lower_layer_path, sizeof(lower_layer_path), "Device.Bridging.Bridge.%s.Port.", ((struct bridge_vlanport_args *)data)->br_inst);
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
snprintf(lower_layer_path, sizeof(lower_layer_path), "Device.Bridging.Bridge.%s.Port.", ((struct bridge_vlanport_args *)data)->br_inst);
if (strncmp(value, lower_layer_path, strlen(lower_layer_path)) == 0) {
char *linker = NULL;
@ -3079,20 +3093,16 @@ static int get_BridgingBridgeProviderBridge_SVLANcomponent(char *refparam, struc
static int set_BridgingBridgeProviderBridge_SVLANcomponent(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *bridge_linker = NULL;
char *allowed_objects[] = {"Device.Bridging.Bridge.", NULL};
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (strncmp(value, "Device.Bridging.Bridge.", 23) != 0)
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
adm_entry_get_linker_value(ctx, value, &bridge_linker);
if (bridge_linker == NULL)
return FAULT_9005;
break;
case VALUESET:
set_Provider_bridge_component(refparam, ctx, data, instance, value, "SVLAN");
@ -3127,8 +3137,8 @@ static int get_BridgingBridgeProviderBridge_CVLANcomponents(char *refparam, stru
static int set_BridgingBridgeProviderBridge_CVLANcomponents(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.Bridging.Bridge.", NULL};
char *pch = NULL, *pchr = NULL;
char *bridge_linker = NULL;
char buf[512] = {0};
DM_STRNCPY(buf, value, sizeof(buf));
@ -3142,12 +3152,8 @@ static int set_BridgingBridgeProviderBridge_CVLANcomponents(char *refparam, stru
for (pch = strtok_r(buf, ",", &pchr); pch != NULL; pch = strtok_r(NULL, ",", &pchr)) {
// Parse each Bridge path and validate:
if (strncmp(pch, "Device.Bridging.Bridge.", 23) != 0)
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
adm_entry_get_linker_value(ctx, pch, &bridge_linker);
if (bridge_linker == NULL)
return FAULT_9005;
}
break;

View file

@ -260,8 +260,6 @@ static int get_device_active_fwimage(char *refparam, struct dmctx *ctx, void *da
snprintf(linker, sizeof(linker), "fw_image:%s", id ? id : "");
adm_entry_get_linker_param(ctx, "Device.DeviceInfo.FirmwareImage.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -283,13 +281,12 @@ static int get_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data
snprintf(linker, sizeof(linker), "fw_image:%s", id ? id : "");
adm_entry_get_linker_param(ctx, "Device.DeviceInfo.FirmwareImage.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.DeviceInfo.FirmwareImage.", NULL};
char *linker = NULL;
switch (action) {
@ -297,11 +294,7 @@ static int set_device_boot_fwimage(char *refparam, struct dmctx *ctx, void *data
if (dm_validate_string(value, -1, -1, NULL, NULL))
return FAULT_9007;
if (strncmp(value, "Device.DeviceInfo.FirmwareImage.", 32) != 0)
return FAULT_9007;
adm_entry_get_linker_value(ctx, value, &linker);
if (linker == NULL || *linker == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;

View file

@ -177,6 +177,7 @@ int get_value_in_mac_format(struct uci_section *s, char *option_name, bool type,
int set_DHCP_Interface(struct dmctx *ctx, char *value, struct uci_section *config_s, struct uci_section *dmmap_s, char *dmmap_name, char *proto, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *linker = NULL, *added_by_controller = NULL, *curr_proto = NULL;
struct uci_section *interface_s = NULL;
@ -185,14 +186,7 @@ int set_DHCP_Interface(struct dmctx *ctx, char *value, struct uci_section *confi
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (value == NULL || *value == '\0')
break;
if (strncmp(value, "Device.IP.Interface.", 20) != 0)
return FAULT_9007;
adm_entry_get_linker_value(ctx, value, &linker);
if (linker == NULL || linker[0] == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
@ -1328,27 +1322,26 @@ static int get_DHCPv4ServerPool_Interface(char *refparam, struct dmctx *ctx, voi
{
char *linker = dmstrdup(((struct dhcp_args *)data)->interface);
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
dmfree(linker);
return 0;
}
static int set_DHCPv4ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section((((struct dhcp_args *)data)->sections)->config_section, "interface", linker);
dmfree(linker);
}
dmuci_set_value_by_section((((struct dhcp_args *)data)->sections)->config_section, "interface", linker ? linker : "");
return 0;
}
return 0;
@ -2032,8 +2025,6 @@ static int get_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *d
char *linker = dmstrdup(dhcp_s ? section_name(dhcp_s) : "");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -488,8 +488,6 @@ static int get_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *d
char *linker = dmstrdup(parent_s ? parent_s + 1 : dhcpv6_s ? section_name(dhcpv6_s) : "");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -730,30 +728,28 @@ static int set_DHCPv6ServerPool_Order(char *refparam, struct dmctx *ctx, void *d
static int get_DHCPv6ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *linker;
linker = dmstrdup(((struct dhcpv6_args *)data)->interface);
char *linker = dmstrdup(((struct dhcpv6_args *)data)->interface);
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
dmfree(linker);
return 0;
}
static int set_DHCPv6ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section((((struct dhcpv6_args *)data)->dhcp_sections)->config_section, "interface", linker);
dmfree(linker);
}
dmuci_set_value_by_section((((struct dhcpv6_args *)data)->dhcp_sections)->config_section, "interface", linker ? linker : "");
break;
}
return 0;

View file

@ -250,12 +250,10 @@ static int get_server_dns_server(char *refparam, struct dmctx *ctx, void *data,
static int get_dns_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *linker;
char *linker = NULL;
dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &linker);
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -336,8 +334,6 @@ static int get_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx,
{
char *linker = get_diagnostics_option("nslookup", "interface");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -521,29 +517,38 @@ static int set_dns_server(char *refparam, struct dmctx *ctx, void *data, char *i
static int set_dns_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *str, *interface, *ip, *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker == NULL || linker[0] == '\0')
dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &ip);
if (!linker || linker[0] == 0) {
dmuci_del_list_value("network", interface, "dns", ip);
return 0;
} else if (strcmp(interface, linker) == 0)
return 0;
dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
if (strcmp(interface, linker) == 0)
return 0;
dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
if (str[0] == '1')
return 0;
dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &ip);
dmuci_del_list_value("network", interface, "dns", ip);
dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &str);
if (str[0] == '1')
dmuci_add_list_value("network", linker, "dns", ip);
dmuci_set_value_by_section((struct uci_section *)data, "interface", interface);
break;
}
@ -601,10 +606,16 @@ static int set_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmct
static int set_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
NSLOOKUP_STOP

View file

@ -998,10 +998,9 @@ static int get_DSLChannel_Name(char *refparam, struct dmctx *ctx, void *data, ch
static int get_DSLChannel_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char linker[8];
snprintf(linker, sizeof(linker), "line_%s", ((struct dsl_line_args *)data)->id);
adm_entry_get_linker_param(ctx, "Device.DSL.Line.", linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
if (*value == NULL)
*value = "";
adm_entry_get_linker_param(ctx, "Device.DSL.Line.", linker, value);
return 0;
}

View file

@ -425,29 +425,30 @@ static int get_DynamicDNSClient_LastError(char *refparam, struct dmctx *ctx, voi
/*#Device.DynamicDNS.Client.{i}.Server!UCI:ddns/service,@i-1/service_name*/
static int get_DynamicDNSClient_Server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *service_name;
char *service_name = NULL;
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "service_name", &service_name);
adm_entry_get_linker_param(ctx, "Device.DynamicDNS.Server.", service_name, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_DynamicDNSClient_Server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.DynamicDNS.Server.", NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "service_name", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "service_name", linker ? linker : "");
break;
}
return 0;
@ -456,29 +457,30 @@ static int set_DynamicDNSClient_Server(char *refparam, struct dmctx *ctx, void *
/*#Device.DynamicDNS.Client.{i}.Interface!UCI:ddns/service,@i-1/interface*/
static int get_DynamicDNSClient_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *interface;
char *interface = NULL;
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "interface", &interface);
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", interface, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_DynamicDNSClient_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", linker ? linker : "");
break;
}
return 0;

View file

@ -78,7 +78,7 @@ static void get_bridge_port_linker(struct dmctx *ctx, char *device_s_name, char
{
struct uci_section *dmmap_section = NULL, *bridge_port = NULL;
*value = NULL;
*value = "";
get_dmmap_section_of_config_section("dmmap_bridge", "device", device_s_name, &dmmap_section);
if (dmmap_section != NULL) {
char *br_inst = NULL;
@ -946,48 +946,66 @@ static int get_EthernetLink_LastChange(char *refparam, struct dmctx *ctx, void *
static int get_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *linker = NULL;
char *device_s_type = NULL;
dmuci_get_value_by_section_string((struct uci_section *)data, "LowerLayers", value);
dmuci_get_value_by_section_string((struct uci_section *)data, "device", &linker);
if (!linker || *linker == '\0')
return 0;
if ((*value)[0] == '\0') {
char *linker = NULL;
char *device_s_type = NULL;
// get device section mapped to this device name
struct uci_section *br_device_s = ethernet___get_device_section(linker);
dmuci_get_value_by_section_string((struct uci_section *)data, "device", &linker);
if (!linker || *linker == '\0')
return 0;
if (br_device_s) dmuci_get_value_by_section_string(br_device_s, "type", &device_s_type);
// get device section mapped to this device name
struct uci_section *br_device_s = ethernet___get_device_section(linker);
if (br_device_s && strcmp(device_s_type, "bridge") == 0) {
get_bridge_port_linker(ctx, section_name(br_device_s), value);
} else {
char *vid = strchr(linker, '.');
if (vid) *vid = '\0';
char *macvlan = strchr(linker, '_');
if (macvlan) *macvlan = '\0';
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", linker, value);
if (br_device_s) dmuci_get_value_by_section_string(br_device_s, "type", &device_s_type);
if (br_device_s && strcmp(device_s_type, "bridge") == 0) {
get_bridge_port_linker(ctx, section_name(br_device_s), value);
} else {
char *vid = strchr(linker, '.');
if (vid) *vid = '\0';
char *macvlan = strchr(linker, '_');
if (macvlan) *macvlan = '\0';
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", linker, value);
}
}
if (*value == NULL)
*value = "";
return 0;
}
static int set_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char eth_interface[64] = "Device.Ethernet.Interface.";
char bridge_port[64] = "Device.Bridging.Bridge.";
char atm_link[32] = "Device.ATM.Link.";
char ptm_link[32] = "Device.PTM.Link.";
char *allowed_objects[] = {
eth_interface,
bridge_port,
atm_link,
ptm_link,
NULL};
char *link_linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string_list(value, -1, -1, 1024, -1, -1, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &link_linker);
if (link_linker == NULL || *link_linker == '\0')
return -1;
if (strncmp(value, "Device.Ethernet.Interface.", 26) == 0) {
// Store LowerLayers value under dmmap section
dmuci_set_value_by_section((struct uci_section *)data, "LowerLayers", value);
if (!link_linker || link_linker[0] == 0) {
dmuci_set_value_by_section((struct uci_section *)data, "device", "");
} else if (strncmp(value, eth_interface, strlen(eth_interface)) == 0) {
struct uci_section *s = NULL;
char *int_name = NULL;
@ -1000,7 +1018,7 @@ static int set_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void
break;
}
}
} else if (strncmp(value, "Device.Bridging.Bridge.", 23) == 0) {
} else if (strncmp(value, bridge_port, strlen(bridge_port)) == 0) {
char br_linker[250] = {0};
DM_STRNCPY(br_linker, link_linker, sizeof(br_linker));
@ -1256,31 +1274,40 @@ static int get_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx
adm_entry_get_linker_param(ctx, "Device.Ethernet.VLANTermination.", dev_name, value);
} else {
adm_entry_get_linker_param(ctx, "Device.Ethernet.Link.", name, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.Ethernet.Link.", ifname, value);
}
if (*value == NULL)
*value = "";
return 0;
}
static int set_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char eth_vlan_term[64] = "Device.Ethernet.VLANTermination.";
char eth_link[32] = "Device.Ethernet.Link.";
char *allowed_objects[] = {
eth_vlan_term,
eth_link,
NULL};
char *vlan_linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string_list(value, -1, -1, 1024, -1, -1, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &vlan_linker);
if (vlan_linker == NULL || *vlan_linker == '\0')
return -1;
if (strncmp(value, "Device.Ethernet.Link.", 21) == 0) {
if (!vlan_linker || vlan_linker[0] == 0) {
// Set ifname and name options of device section to empty value
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", "");
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "name", "");
} else if (strncmp(value, eth_link, strlen(eth_link)) == 0) {
char new_name[16] = {0}, *type;
// Get type option from device section
@ -1335,7 +1362,7 @@ static int set_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", vlan_linker);
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "name", new_name);
} else if (strncmp(value, "Device.Ethernet.VLANTermination.", 32) == 0) {
} else if (strncmp(value, eth_vlan_term, strlen(eth_vlan_term)) == 0) {
struct uci_section *ss = NULL;
char *dev_name, *inner_vid, *vid, new_name[16] = {0};
@ -1614,12 +1641,10 @@ static int get_EthernetRMONStats_Name(char *refparam, struct dmctx *ctx, void *d
static int get_EthernetRMONStats_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *linker;
char *linker = NULL;
dmuci_get_value_by_section_string((((struct eth_rmon_args *)data)->sections)->config_section, "ifname", &linker);
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -395,7 +395,7 @@ static int get_rule_source_interface(char *refparam, struct dmctx *ctx, void *da
src_iface[0] = 0;
uci_foreach_element(net_list, e) {
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", e->name, &ifaceobj);
if (ifaceobj)
if (ifaceobj && *ifaceobj)
pos += snprintf(&src_iface[pos], sizeof(src_iface) - pos, "%s,", ifaceobj);
}
@ -403,7 +403,7 @@ static int get_rule_source_interface(char *refparam, struct dmctx *ctx, void *da
src_iface[pos - 1] = 0;
} else {
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", src, &ifaceobj);
if (ifaceobj)
if (ifaceobj && *ifaceobj)
DM_STRNCPY(src_iface, ifaceobj, sizeof(src_iface));
}
@ -450,7 +450,7 @@ static int get_rule_dest_interface(char *refparam, struct dmctx *ctx, void *data
dst_iface[0] = 0;
uci_foreach_element(net_list, e) {
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", e->name, &ifaceobj);
if (ifaceobj)
if (ifaceobj && *ifaceobj)
pos += snprintf(&dst_iface[pos], sizeof(dst_iface) - pos, "%s,", ifaceobj);
}
@ -458,7 +458,7 @@ static int get_rule_dest_interface(char *refparam, struct dmctx *ctx, void *data
dst_iface[pos - 1] = 0;
} else {
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", dest, &ifaceobj);
if (ifaceobj)
if (ifaceobj && *ifaceobj)
DM_STRNCPY(dst_iface, ifaceobj, sizeof(dst_iface));
}
@ -943,6 +943,7 @@ static int set_rule_log(char *refparam, struct dmctx *ctx, void *data, char *ins
static int set_rule_interface(struct dmctx *ctx, void *data, char *type, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *iface = NULL, *option = NULL;
switch (action) {
@ -950,11 +951,7 @@ static int set_rule_interface(struct dmctx *ctx, void *data, char *type, char *v
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (*value == '\0')
break;
adm_entry_get_linker_value(ctx, value, &iface);
if (iface == NULL || iface[0] == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;

View file

@ -98,8 +98,6 @@ static int get_HostsHost_DHCPClient(char *refparam, struct dmctx *ctx, void *dat
{
char *linker = dmjson_get_value((json_object *)data, 1, "macaddr");
adm_entry_get_linker_param(ctx, "Device.DHCPv4.Server.Pool.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -107,8 +105,6 @@ static int get_HostsHost_AssociatedDevice(char *refparam, struct dmctx *ctx, voi
{
char *linker = dmjson_get_value((json_object *)data, 1, "macaddr");
adm_entry_get_linker_param(ctx, "Device.WiFi.AccessPoint.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -120,8 +116,6 @@ static int get_HostsHost_Layer1Interface(char *refparam, struct dmctx *ctx, void
adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", linker, value);
else
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -129,8 +123,6 @@ static int get_HostsHost_Layer3Interface(char *refparam, struct dmctx *ctx, void
{
char *linker = dmjson_get_value((json_object *)data, 1, "network");
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -1365,8 +1365,6 @@ static int get_IEEE1905ALNetworkTopologyIEEE1905DeviceNonIEEE1905Neighbor_LocalI
{
char *linker = ((struct ieee1905_device_nonieee1905neighbor_args *)data)->mac_addr;
adm_entry_get_linker_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -1402,8 +1400,6 @@ static int get_IEEE1905ALNetworkTopologyIEEE1905DeviceIEEE1905Neighbor_LocalInte
{
char *linker = dmjson_get_value((json_object *)data, 1, "macaddress");
adm_entry_get_linker_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -1496,8 +1492,6 @@ static int get_IEEE1905ALNetworkTopologyIEEE1905DeviceBridgingTuple_InterfaceLis
{
char *linker = dmjson_get_value((json_object *)data, 1, "macaddress");
adm_entry_get_linker_param(ctx, "Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -1236,50 +1236,67 @@ static int get_IPInterface_LastChange(char *refparam, struct dmctx *ctx, void *d
static int get_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char linker[64] = {0};
char *proto;
struct uci_section *dmmap_section = NULL;
dmuci_get_value_by_section_string((struct uci_section *)data, "proto", &proto);
if (strstr(proto, "ppp")) {
snprintf(linker, sizeof(linker), "%s", section_name((struct uci_section *)data));
adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", linker, value);
if (*value != NULL)
return 0;
}
get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &dmmap_section);
dmuci_get_value_by_section_string(dmmap_section, "LowerLayers", value);
char *device = get_device(section_name((struct uci_section *)data));
if ((*value)[0] == '\0') {
char linker[64] = {0};
char *proto;
/* If the device value is empty, then get its value directly from device option */
if (*device == '\0')
dmuci_get_value_by_section_string((struct uci_section *)data, "device", &device);
dmuci_get_value_by_section_string((struct uci_section *)data, "proto", &proto);
if (strstr(proto, "ppp")) {
snprintf(linker, sizeof(linker), "%s", section_name((struct uci_section *)data));
adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", linker, value);
if (*value != NULL && (*value)[0] != 0)
return 0;
}
if (device[0] != '\0') {
adm_entry_get_linker_param(ctx, "Device.Ethernet.VLANTermination.", device, value);
if (*value != NULL)
return 0;
}
char *device = get_device(section_name((struct uci_section *)data));
if (device[0] != '\0') {
DM_STRNCPY(linker, device, sizeof(linker));
char *vid = strchr(linker, '.');
if (vid) *vid = '\0';
/* If the device value is empty, then get its value directly from device option */
if (*device == '\0')
dmuci_get_value_by_section_string((struct uci_section *)data, "device", &device);
if (device[0] != '\0') {
adm_entry_get_linker_param(ctx, "Device.Ethernet.VLANTermination.", device, value);
if (*value != NULL && (*value)[0] != 0)
return 0;
}
if (device[0] != '\0') {
DM_STRNCPY(linker, device, sizeof(linker));
char *vid = strchr(linker, '.');
if (vid) *vid = '\0';
} else {
struct uci_section *s = NULL;
get_dmmap_section_of_config_section_eq("dmmap", "link", "section_name", section_name((struct uci_section *)data), &s);
dmuci_get_value_by_section_string(s, "linker", &device);
DM_STRNCPY(linker, device, sizeof(linker));
}
adm_entry_get_linker_param(ctx, "Device.Ethernet.Link.", linker, value);
} else {
struct uci_section *s = NULL;
char *linker = NULL;
get_dmmap_section_of_config_section_eq("dmmap", "link", "section_name", section_name((struct uci_section *)data), &s);
dmuci_get_value_by_section_string(s, "linker", &device);
DM_STRNCPY(linker, device, sizeof(linker));
adm_entry_get_linker_value(ctx, *value, &linker);
if (!linker || *linker == 0)
*value = "";
}
adm_entry_get_linker_param(ctx, "Device.Ethernet.Link.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
struct uci_section *dmmap_section = NULL;
char eth_vlan_term[64] = "Device.Ethernet.VLANTermination.";
char eth_link[32] = "Device.Ethernet.Link.";
char *allowed_objects[] = {
eth_vlan_term,
eth_link,
NULL};
char linker_buf[32] = {0};
char *ip_linker = NULL;
@ -1288,21 +1305,26 @@ static int set_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *
if (dm_validate_string_list(value, -1, -1, 1024, -1, -1, NULL, NULL))
return FAULT_9007;
if (strncmp(value, "Device.Ethernet.VLANTermination.", 32) != 0 &&
strncmp(value, "Device.Ethernet.Link.", 21) != 0)
return FAULT_9007;
adm_entry_get_linker_value(ctx, value, &ip_linker);
if (ip_linker == NULL || *ip_linker == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &ip_linker);
// Store LowerLayers value under dmmap_network section
get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &dmmap_section);
dmuci_set_value_by_section(dmmap_section, "LowerLayers", value);
if (!ip_linker || *ip_linker == 0) {
// Update device option
dmuci_set_value_by_section((struct uci_section *)data, "device", "");
return 0;
}
DM_STRNCPY(linker_buf, ip_linker, sizeof(linker_buf));
if (strncmp(value, "Device.Ethernet.VLANTermination.", 32) == 0) {
if (strncmp(value, eth_vlan_term, strlen(eth_vlan_term)) == 0) {
struct uci_section *s = NULL, *stmp = NULL;
// Remove the device section corresponding to this interface if exists
@ -1341,7 +1363,7 @@ static int set_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *
// Update device option
dmuci_set_value_by_section((struct uci_section *)data, "device", linker_buf);
} else if (strncmp(value, "Device.Ethernet.Link.", 21) == 0) {
} else if (strncmp(value, eth_link, strlen(eth_link)) == 0) {
// Get interface name from Ethernet.Link. object
struct uci_section *eth_link_s = NULL;
@ -2020,10 +2042,7 @@ static int get_IPInterfaceIPv6Prefix_ParentPrefix(char *refparam, struct dmctx *
char *linker = NULL;
dmuci_get_value_by_section_string(((struct intf_ip_args *)data)->dmmap_sec, "address", &linker);
if (linker && *linker)
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
return 0;
}

View file

@ -234,7 +234,7 @@ static int get_nat_interface_setting_interface(char *refparam, struct dmctx *ctx
uci_foreach_element(v, e) {
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", e->name, &ifaceobj); // MEM WILL BE FREED IN DMMEMCLEAN
if (ifaceobj)
if (ifaceobj && *ifaceobj)
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s,", ifaceobj);
}
}
@ -249,22 +249,24 @@ static int get_nat_interface_setting_interface(char *refparam, struct dmctx *ctx
static int set_nat_interface_setting_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *iface, *pch, *pchr, buf[256] = "";
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
DM_STRNCPY(buf, value, sizeof(buf));
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "network", "");
for(pch = strtok_r(buf, ",", &pchr); pch != NULL; pch = strtok_r(NULL, ",", &pchr)) {
adm_entry_get_linker_value(ctx, pch, &iface);
if (iface && *iface) {
dmuci_add_list_value_by_section(((struct dmmap_dup *)data)->config_section, "network", iface);
dmfree(iface);
}
dmuci_add_list_value_by_section(((struct dmmap_dup *)data)->config_section, "network", iface);
}
return 0;
}
@ -372,7 +374,7 @@ static int get_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, voi
uci_foreach_element(v, e) {
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", e->name, &ifaceobj); // MEM WILL BE FREED IN DMMEMCLEAN
if (ifaceobj)
if (ifaceobj && *ifaceobj)
pos += snprintf(&buf[pos], sizeof(buf) - pos, "%s,", ifaceobj);
}
}
@ -387,12 +389,17 @@ static int get_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, voi
static int set_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *iface = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &iface);
@ -424,6 +431,8 @@ static int set_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, voi
}
}
dmfree(iface);
} else {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "src", "");
}
break;
}

View file

@ -776,32 +776,37 @@ static int get_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch
}
adm_entry_get_linker_param(ctx, "Device.ATM.Link.", ifname, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.PTM.Link.", ifname, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", ifname, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", ifname, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {
"Device.Ethernet.Interface.",
"Device.ATM.Link.",
"Device.PTM.Link.",
"Device.WiFi.SSID.",
NULL};
char *ppp_linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string_list(value, -1, -1, 1024, -1, -1, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &ppp_linker);
if (ppp_linker && *ppp_linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "device", ppp_linker);
dmfree(ppp_linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "device", ppp_linker ? ppp_linker : "");
return 0;
}
return 0;

View file

@ -193,10 +193,7 @@ static int find_lower_layer_by_dmmap_link(struct dmctx *ctx, void *data, char* d
char *linker = NULL;
dmuci_get_value_by_section_string((((struct ptm_args *)data)->sections)->dmmap_section, "ptm_ll_link", &linker);
if (linker != NULL)
adm_entry_get_linker_param(ctx, dm_object, linker, value);
if (*value == NULL)
*value = "";
adm_entry_get_linker_param(ctx, dm_object, linker, value);
return 0;
}

View file

@ -341,33 +341,38 @@ static int get_QInterface(char *refparam, struct dmctx *ctx, void *data, char *i
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "ifname", &ifname);
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", ifname, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", ifname, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", ifname, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", ifname, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_QInterface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {
"Device.IP.Interface.",
"Device.PPP.Interface.",
"Device.Ethernet.Interface.",
"Device.WiFi.Radio.",
NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ifname", linker ? linker : "");
break;
}
return 0;
@ -1533,40 +1538,30 @@ static int set_QoSQueueStats_Alias(char *refparam, struct dmctx *ctx, void *data
static int get_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *queue_link;
char *queue_link = NULL;
dmuci_get_value_by_section_string((struct uci_section *)data, "queue", &queue_link);
adm_entry_get_linker_param(ctx, "Device.QoS.Queue.", queue_link, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *queue_link = NULL;
char *allowed_objects[] = {"Device.QoS.Queue.", NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (value == NULL || *value == '\0')
break;
if (strncmp(value, "Device.QoS.Queue.", 17) != 0)
return FAULT_9007;
adm_entry_get_linker_value(ctx, value, &queue_link);
if (queue_link == NULL || *queue_link == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
if (value == NULL || *value == '\0')
break;
adm_entry_get_linker_value(ctx, value, &queue_link);
dmuci_set_value_by_section((struct uci_section *)data, "queue", queue_link);
adm_entry_get_linker_value(ctx, value, &linker);
dmuci_set_value_by_section((struct uci_section *)data, "queue", linker ? linker : "");
break;
}
return 0;
@ -1574,41 +1569,39 @@ static int set_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data
static int get_QoSQueueStats_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *intf_link;
char *intf_link = NULL;
dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &intf_link);
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", intf_link, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", intf_link, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", intf_link, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_QoSQueueStats_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *intf_link = NULL;
char *allowed_objects[] = {
"Device.Ethernet.Interface.",
"Device.IP.Interface.",
"Device.PPP.Interface.",
NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (value == NULL || *value == '\0')
break;
adm_entry_get_linker_value(ctx, value, &intf_link);
if (intf_link == NULL || *intf_link == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
if (value == NULL || *value == '\0')
break;
adm_entry_get_linker_value(ctx, value, &intf_link);
dmuci_set_value_by_section((struct uci_section *)data, "interface", intf_link);
adm_entry_get_linker_value(ctx, value, &linker);
dmuci_set_value_by_section((struct uci_section *)data, "interface", linker ? linker : "");
break;
}
return 0;

View file

@ -283,26 +283,26 @@ static int get_RouterAdvertisementInterfaceSetting_Interface(char *refparam, str
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "interface", &linker);
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_RouterAdvertisementInterfaceSetting_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, -1, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "interface", linker ? linker : "");
break;
}
return 0;

View file

@ -674,29 +674,27 @@ static int get_RoutingRouterForwarding_Interface(char *refparam, struct dmctx *c
char *linker = NULL;
dmuci_get_value_by_section_string(((struct routingfwdargs *)data)->routefwdsection, "interface", &linker);
if (linker && linker[0] != '\0') {
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
if (*value == NULL)
*value = "";
}
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
return 0;
}
static int set_RoutingRouterForwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &linker);
if (linker && *linker) {
dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "interface", linker);
dmfree(linker);
}
dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "interface", linker ? linker : "");
return 0;
}
return 0;
@ -957,11 +955,9 @@ static int get_RoutingRouteInformationInterfaceSetting_Interface(char *refparam,
}
}
if (iface[0] != '\0') {
if (iface && *iface != 0)
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", iface, value);
if (*value == NULL)
*value = "";
}
return 0;
}

View file

@ -504,10 +504,8 @@ static int get_UPnPDiscoveryService_Location(char *refparam, struct dmctx *ctx,
static int get_UPnPDiscoveryService_ParentDevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.RootDevice.", ((struct upnpdiscovery *)data)->uuid, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.Device.", ((struct upnpdiscovery *)data)->uuid, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -549,25 +547,23 @@ static int get_UPnPDescriptionDeviceInstance_UDN(char *refparam, struct dmctx *c
static int get_UPnPDescriptionDeviceInstance_ParentDevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
adm_entry_get_linker_param(ctx, "Device.UPnP.Description.DeviceInstance.", ((struct upnp_device_inst *)data)->parentudn, value);
if (*value == NULL)
*value = "";
return 0;
}
static int get_UPnPDescriptionDeviceInstance_DiscoveryDevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
struct upnp_device_inst *upnpdevinst = (struct upnp_device_inst *)data;
char **udnarray = NULL;
size_t length;
if (upnpdevinst->udn && upnpdevinst->udn[0]) {
char **udnarray = NULL;
size_t length = 0;
udnarray = strsplit(upnpdevinst->udn, ":", &length);
adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.RootDevice.", udnarray[1], value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.Device.", udnarray[1], value);
}
if (*value == NULL)
*value = "";
return 0;
}
@ -651,8 +647,6 @@ static int get_UPnPDescriptionDeviceInstance_PresentationURL(char *refparam, str
static int get_UPnPDescriptionServiceInstance_ParentDevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
adm_entry_get_linker_param(ctx, "Device.UPnP.Description.DeviceInstance.", ((struct upnp_service_inst *)data)->parentudn, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -665,14 +659,10 @@ static int get_UPnPDescriptionServiceInstance_ServiceId(char *refparam, struct d
static int get_UPnPDescriptionServiceInstance_ServiceDiscovery(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *usn = NULL;
char usn[64] = {0};
dmasprintf(&usn, "%s::%s", ((struct upnp_service_inst *)data)->parentudn, ((struct upnp_service_inst *)data)->servicetype);
if (usn && usn[0]) {
adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.Service.", usn, value);
if (*value == NULL)
*value = "";
}
snprintf(usn, sizeof(usn), "%s::%s", ((struct upnp_service_inst *)data)->parentudn, ((struct upnp_service_inst *)data)->servicetype);
adm_entry_get_linker_param(ctx, "Device.UPnP.Discovery.Service.", usn, value);
return 0;
}

View file

@ -895,7 +895,7 @@ out:
static int get_USBUSBHostsHostDevice_USBPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
struct usb_port *port= (struct usb_port *)data;
struct usb_port *port = (struct usb_port *)data;
adm_entry_get_linker_param(ctx, "Device.USB.Port.", port->folder_name, value);
return 0;
}
@ -912,15 +912,15 @@ static int get_USBUSBHostsHostDevice_Parent(char *refparam, struct dmctx *ctx, v
regex_t regex1 = {};
regcomp(&regex1, "^[0-9][0-9]*-[0-9]*[0-9]\\.[0-9]*[0-9]$", 0);
if(regexec(&regex1, port->folder_name, 0, NULL, 0) != 0 || port->dmsect == NULL){
if (regexec(&regex1, port->folder_name, 0, NULL, 0) != 0 || port->dmsect == NULL) {
*value = "";
goto out;
}
dmuci_get_value_by_section_string(port->dmsect, "usb_host_instance", &host_inst);
snprintf(usb_host_path, sizeof(usb_host_path), "Device.USB.USBHosts.Host.%s.Device.", host_inst);
adm_entry_get_linker_param(ctx, usb_host_path, port->folder_name, value);
if (*value == NULL)
*value = "";
out:
regfree(&regex1);
return 0;

View file

@ -2448,9 +2448,7 @@ static int set_WiFiEndPoint_Alias(char *refparam, struct dmctx *ctx, void *data,
static int get_WiFiEndPoint_SSIDReference(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", ((struct wifi_enp_args *)data)->ifname, value); // MEM WILL BE FREED IN DMMEMCLEAN
if (*value == NULL)
*value = "";
adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", ((struct wifi_enp_args *)data)->ifname, value);
return 0;
}
@ -2854,29 +2852,27 @@ static int set_access_point_alias(char *refparam, struct dmctx *ctx, void *data,
static int get_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
if (data && ((struct wifi_ssid_args *)data)->linker[0] != '\0') {
adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", ((struct wifi_ssid_args *)data)->linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
if (*value == NULL)
*value = "";
}
adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", ((struct wifi_ssid_args *)data)->linker, value);
return 0;
}
static int set_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *ssid_linker = NULL;
char *allowed_objects[] = {"Device.WiFi.Radio.", NULL};
char *linker = NULL;
switch (action) {
case VALUECHECK:
if (dm_validate_string_list(value, -1, -1, 1024, -1, -1, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
return 0;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &ssid_linker);
if (ssid_linker && *ssid_linker) {
dmuci_set_value_by_section((((struct wifi_ssid_args *)data)->sections)->config_section, "device", ssid_linker);
dmfree(ssid_linker);
}
adm_entry_get_linker_value(ctx, value, &linker);
dmuci_set_value_by_section((((struct wifi_ssid_args *)data)->sections)->config_section, "device", linker ? linker : "");
return 0;
}
return 0;
@ -2884,14 +2880,13 @@ static int set_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, c
static int get_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", ((struct wifi_acp_args *)data)->ifname, value); // MEM WILL BE FREED IN DMMEMCLEAN
if (*value == NULL)
*value = "";
adm_entry_get_linker_param(ctx, "Device.WiFi.SSID.", ((struct wifi_acp_args *)data)->ifname, value);
return 0;
}
static int set_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.WiFi.SSID.", NULL};
struct uci_section *s = NULL, *ssid_dmmap_s = NULL;
char *linker = NULL;
@ -2900,14 +2895,7 @@ static int set_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char *
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (*value == '\0')
break;
if (strncmp(value, "Device.WiFi.SSID.", 17) != 0)
return FAULT_9007;
adm_entry_get_linker_value(ctx, value, &linker);
if (linker == NULL || linker[0] == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;

View file

@ -23,27 +23,23 @@ static int get_time_source_interface(char *refparam, struct dmctx *ctx, void *da
char *iface = NULL;
dmuci_get_option_value_string("system", "ntp", "interface", &iface);
if (*iface == '\0' || strlen(iface) == 0)
return 0;
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", iface, value);
if (*value == NULL)
*value = "";
return 0;
}
static int set_time_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *iface = NULL;
switch (action) {
case VALUECHECK:
adm_entry_get_linker_value(ctx, value, &iface);
if (iface == NULL || iface[0] == '\0')
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
adm_entry_get_linker_value(ctx, value, &iface);
dmuci_set_value("system", "ntp", "interface", iface);
dmuci_set_value("system", "ntp", "interface", iface ? iface : "");
return 0;
}
return 0;

View file

@ -1353,20 +1353,14 @@ static int get_igmp_cgrp_assoc_dev_no_of_entries(char *refparam, struct dmctx *c
static int get_igmp_cgrp_adev_iface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *ifname = dmjson_get_value((json_object *)data, 1, "device");
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", ifname, value);
if (*value == NULL)
*value = "";
return 0;
}
static int get_igmp_cgrp_adev_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
char *ipaddr = dmjson_get_value((json_object *)data, 1, "ipaddr");
adm_entry_get_linker_param(ctx, "Device.Hosts.Host.", ipaddr, value);
if (*value == NULL)
*value = "";
return 0;
}
@ -1737,6 +1731,7 @@ static void set_igmpp_iface_val(void *data, char *instance, char *linker, char *
static int set_igmpp_interface_iface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *linker = NULL, *interface_linker = NULL;
char ifname[16] = {0};
char *if_type = NULL;
@ -1747,6 +1742,10 @@ static int set_igmpp_interface_iface(char *refparam, struct dmctx *ctx, void *da
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
// First check if this is a bridge type interface
@ -1770,6 +1769,8 @@ static int set_igmpp_interface_iface(char *refparam, struct dmctx *ctx, void *da
}
break;
}
} else {
interface_linker = "";
}
}
@ -1833,16 +1834,11 @@ static int get_igmpp_interface_iface(char *refparam, struct dmctx *ctx, void *da
} else {
// in case its a L3 interface, the ifname would be section name of network file in the dmmap file,
// which infact is the linker, just use that directly.
if (igmpp_ifname == NULL)
goto end;
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", igmpp_ifname, value);
}
end:
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -436,6 +436,7 @@ static int get_mldp_cgrp_stats_lrcvd(char *refparam, struct dmctx *ctx, void *da
static int set_mldp_interface_iface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
char *allowed_objects[] = {"Device.IP.Interface.", NULL};
char *linker = NULL, *interface_linker = NULL;
char ifname[16];
char *up, *f_inst, *if_type;
@ -446,6 +447,10 @@ static int set_mldp_interface_iface(char *refparam, struct dmctx *ctx, void *dat
case VALUECHECK:
if (dm_validate_string(value, -1, 256, NULL, NULL))
return FAULT_9007;
if (dm_entry_validate_allowed_objects(ctx, value, allowed_objects))
return FAULT_9007;
break;
case VALUESET:
// First check if this is a bridge type interface
@ -465,8 +470,11 @@ static int set_mldp_interface_iface(char *refparam, struct dmctx *ctx, void *dat
dmuci_get_value_by_section_string(s, "device", &interface_linker);
break;
}
} else {
interface_linker = "";
}
}
uci_path_foreach_option_eq(bbfdm, "dmmap_mcast", "proxy_interface",
"section_name", section_name((struct uci_section *)data), d_sec) {
dmuci_get_value_by_section_string(d_sec, "iface_instance", &f_inst);
@ -551,16 +559,10 @@ static int get_mldp_interface_iface(char *refparam, struct dmctx *ctx, void *dat
}
}
if (tmp_linker == NULL)
goto end;
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", tmp_linker, value);
}
end:
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -262,12 +262,10 @@ static int openwrt__get_QoSClassification_Interface(char *refparam, struct dmctx
dmuci_get_value_by_section_string(s, "classgroup", &ifaceclassgrp);
if (ifaceclassgrp != NULL && strcmp(ifaceclassgrp, classgroup) == 0) {
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", section_name(s), value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", section_name(s), value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", section_name(s), value);
if (*value == NULL)
*value = "";
}
}
return 0;
@ -485,14 +483,12 @@ static int openwrt__get_QoSQueueStats_Interface(char *refparam, struct dmctx *ct
struct queuestats *qts = (struct queuestats*)data;
adm_entry_get_linker_param(ctx, "Device.IP.Interface.", qts->dev, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.PPP.Interface.", qts->dev, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.Ethernet.Interface.", qts->dev, value);
if (*value == NULL)
if (!(*value) || (*value)[0] == 0)
adm_entry_get_linker_param(ctx, "Device.WiFi.Radio.", qts->dev, value);
if (*value == NULL)
*value = "";
return 0;
}

View file

@ -1773,9 +1773,13 @@ static int get_linker_value_check_obj(DMOBJECT_ARGS)
return FAULT_9005;
if (strcmp(node->current_object, dmctx->in_param) == 0) {
char *link_val;
char *link_val = NULL;
if (!data || !instance)
return FAULT_9005;
get_linker(node->current_object, dmctx, data, instance, &link_val);
dmctx->linker = dmstrdup(link_val);
dmctx->linker = link_val ? dmstrdup(link_val) : "";
dmctx->stop = true;
return 0;
}

View file

@ -228,6 +228,7 @@ void get_dmmap_section_of_config_section_cont(char* dmmap_package, char* section
void get_config_section_of_dmmap_section(char* package, char* section_type, char *section_name, struct uci_section **config_section);
int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value);
int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value);
int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *objects[]);
char *check_create_dmmap_package(const char *dmmap_package);
__attribute__ ((deprecated)) int is_section_unnamed(char *section_name);
__attribute__ ((deprecated)) void delete_sections_save_next_sections(char* dmmap_package, char *section_type, char *instancename, char *section_name, int instance, struct list_head *dup_list);

View file

@ -583,8 +583,6 @@ def cprintGetSetValue(getvalue, setvalue, mappingparam, instance, typeparam, par
get_value += " char *linker = dmstrdup(*value);\n"
get_value += " adm_entry_get_linker_param(ctx, \"%s\", linker, value);\n" % res7
get_value += " dmfree(linker);\n"
get_value += " if (*value == NULL)\n"
get_value += " *value = \"\";"
elif res6 is not None:
get_value += " *value = dmuci_get_value_by_path(\"%s\", \"%s\", \"%s\", \"%s\");" % (
res6, res1, res3, res5)