audio: Change strtok in audiohal to strtok_r [1/2]
PD#SWPL-192409
Problem:
1.strtok is an unsafe function that affects
the value of an incoming variable when it
is called multiple times in the same thread.
Solution:
1.Change strtok to strtok_r.
2.The third parameter of strtok_r stores
the remaining contents of the input variable
and is a thread-safe function.
Verify:
yocto
Change-Id: If0fc37dffce780bf7f62542a54dd6b45c981751f
Signed-off-by: hui.liu <hui.liu@amlogic.com>
diff --git a/audio_hal/audio_hw.c b/audio_hal/audio_hw.c
index 92d2cbb..0b38b38 100644
--- a/audio_hal/audio_hw.c
+++ b/audio_hal/audio_hw.c
@@ -4476,8 +4476,9 @@
char *port_name;
int port_delay = 0;
char *delimiter = ",";
- port_name = strtok(value, delimiter);
- port_delay = (atoi)(strtok(NULL, delimiter));
+ char *remaining_string = value;
+ port_name = strtok_r(value, delimiter, &remaining_string);
+ port_delay = (atoi)(strtok_r(NULL, delimiter, &remaining_string));
aml_audio_set_port_delay(port_name, port_delay);
goto exit;
}
@@ -4491,7 +4492,7 @@
double G = 0;
double Q = 0;
unsigned int eq_type = 0;
- char *rest = value;
+ char *remaining_string = value;
char *token = NULL;
unsigned int eq_band_id = 0;
int aed_master_volume = 0;
@@ -4501,13 +4502,13 @@
set_aed_master_volume_mute(&adev->alsa_mixer, true);
set_dac_digital_volume_mute(&adev->alsa_mixer, true);
aml_audio_sleep(32*1000);
- token = strtok_r(value, ",", &rest);
+ token = strtok_r(value, ",", &remaining_string);
while (token != NULL) {
ret = sscanf(token, "%c:%d:%lf:%lf", &type, &Fc, &G, &Q);
if (ret != 4) {
break;
} else {
- token = strtok_r(NULL, ",", &rest);
+ token = strtok_r(NULL, ",", &remaining_string);
if (type == 'P') {
eq_type = FILTER_TYPE_BANDPASS;
} else {
@@ -4857,7 +4858,8 @@
ret = str_parms_get_str(parms, "cap_buffer", value, sizeof(value));
if (ret >= 0) {
int size = 0;
- char *name = strtok(value, ",");
+ char * remaining_string = value;
+ char *name = strtok_r(value, ",", &remaining_string);
AM_LOGI("cap_buffer %s", value);
if (name) {
size = atoi(name + strlen(name) + 1);
@@ -5357,7 +5359,8 @@
#ifdef BUILD_LINUX
ret = str_parms_get_str(parms, "setenv", value, sizeof(value));
if (ret >= 0) {
- char *var = strtok(value, ",");
+ char *remaining_string;
+ char *var = strtok_r(value, ",", &remaining_string);
if (var) {
char *val = var + strlen(var) + 1;
if (strlen(val) > 0) {
diff --git a/utils/alsa_device_parser.c b/utils/alsa_device_parser.c
index 94bb517..cfc0bbb 100644
--- a/utils/alsa_device_parser.c
+++ b/utils/alsa_device_parser.c
@@ -137,10 +137,11 @@
/* this line contain '[' character */
if (strchr(tempbuffer, '[')) {
- char *Rch = strtok(tempbuffer, "[");
+ char *remaining_string = tempbuffer;
+ char *Rch = strtok_r(tempbuffer, "[", &remaining_string);
int id = atoi(Rch);
ALOGD("\tcurrent card id = %d, Rch = %s", id, Rch);
- Rch = strtok(NULL, " ]");
+ Rch = strtok_r(NULL, " ]", &remaining_string);
ALOGD("\tcurrent sound card name = %s", Rch);
if (strcmp(Rch, name) == 0) {
ALOGD("\t sound cardIndex found = %d", id);
@@ -230,10 +231,11 @@
if (fgets(tempbuffer, READ_BUFFER_SIZE, mCardFile) != NULL) {
/* this line contain '[' character */
if (strchr(tempbuffer, '[') && strstr(tempbuffer, CARD_AML_KEYWORD)) {
- char *Rch = strtok(tempbuffer, "[");
+ char *remaining_string = tempbuffer;
+ char *Rch = strtok_r(tempbuffer, "[", &remaining_string);
mCardIndex = atoi(Rch);
ALOGD("\tcurrent mCardIndex = %d, Rch = %s", mCardIndex, Rch);
- Rch = strtok(NULL, " ]");
+ Rch = strtok_r(NULL, " ]", &remaining_string);
ALOGD("\tcurrent sound card name = %s", Rch);
if (strcmp(Rch, CARD_NAME_AUGE) == 0) {
ALOGD("\t auge sound cardIndex found = %d", mCardIndex);
@@ -306,6 +308,7 @@
char *Rch;
char mStreamName[256];
char *PortName = NULL;
+ char *remaining_string = InputBuffer;
ALOGD("AddPcmString p_info:%p, InputBuffer = %s", p_info, InputBuffer);
if (!p_info) {
@@ -313,7 +316,7 @@
return;
}
- Rch = strtok(InputBuffer, "-");
+ Rch = strtok_r(InputBuffer, "-", &remaining_string);
/* parse for stream name */
if (Rch != NULL) {
struct AudioDeviceDescriptor *mAudioDeviceDescriptor =
@@ -324,9 +327,9 @@
}
mAudioDeviceDescriptor->mCardindex = atoi(Rch);
- Rch = strtok(NULL, ":");
+ Rch = strtok_r(NULL, ":", &remaining_string);
mAudioDeviceDescriptor->mPcmIndex = atoi(Rch);
- Rch = strtok(NULL, ": ");
+ Rch = strtok_r(NULL, ": ", &remaining_string);
if (Rch) {
memcpy(mStreamName, Rch, 256);
PortName = strstr(mStreamName, "alsaPORT-");
@@ -393,7 +396,7 @@
mAudioDeviceDescriptor->mCardindex, mAudioDeviceDescriptor->mPcmIndex, PortName);
}
- Rch = strtok(NULL, ": ");
+ Rch = strtok_r(NULL, ": ", &remaining_string);
}
}
diff --git a/utils/basic_utils/ProcessCallStack.cpp b/utils/basic_utils/ProcessCallStack.cpp
index 0197bed..15ee784 100644
--- a/utils/basic_utils/ProcessCallStack.cpp
+++ b/utils/basic_utils/ProcessCallStack.cpp
@@ -96,8 +96,11 @@
}
// Strip ending newline
- strtok(procName, "\n");
-
+ for (int i = 0; i < strlen(procName); i++) {
+ if (procName[i] == '\n') {
+ procName[i] = '\0';
+ }
+ }
return String8(procName);
}