// runtime configure the probe option
static void _configure(char* configstr)
{
- char buf[64];
gTraceInfo.optionflag = atoll(configstr);
- sprintf(buf, "configure in probe : %s, %llx\n", configstr, gTraceInfo.optionflag);
if isOptionEnabled(OPT_SNAPSHOT)
SCREENSHOT_SET();
else
SCREENSHOT_UNSET();
- PRINTMSG(buf);
+ PRINTMSG("configure in probe : %s, %llx\n", configstr, gTraceInfo.optionflag);
}
void application_exit()
if (gTraceInfo.socket.daemonSock != -1) {
memset(&clientAddr, '\0', sizeof(clientAddr));
clientAddr.sun_family = AF_UNIX;
- sprintf(clientAddr.sun_path, "%s", UDS_NAME);
+ snprintf(clientAddr.sun_path, sizeof(UDS_NAME), "%s", UDS_NAME);
clientLen = sizeof(clientAddr);
if (connect(gTraceInfo.socket.daemonSock,
int recved = 0;
/* send pid and ppid to manager */
- sprintf(buf, "%d %d", getpid(), getppid());
+ snprintf(buf, sizeof(buf), "%d %d", getpid(), getppid());
print_log_str(MSG_PID, buf);
/* we need recv this messages right now! */
recvlen = read(g_timerfd, &xtime, sizeof(xtime));
if(recvlen > 0)
{
- log.length = sprintf(log.data, "%ld", g_total_alloc_size);
+ log.length = snprintf(log.data, sizeof(log.data), "%ld", g_total_alloc_size) + 1;
printLog(&log, MSG_ALLOC);
}
else
void _init_(void)
{
- char msg[DA_LOG_MAX];
-
probeBlockStart();
init_exec_fork();
}
- sprintf(msg, "dynamic analyzer probe helper so loading... pid[%d]\n",
- getpid());
- PRINTMSG(msg);
+ PRINTMSG("dynamic analyzer probe helper so loading... pid[%d]\n",
+ getpid());
gTraceInfo.init_complete = 1;
maps_make();
/* init gl functions */
__init_gl_functions__();
- char msg[DA_LOG_MAX];
- sprintf(msg, "<-lib construnctor");
- PRINTMSG(msg);
+ PRINTMSG("<-lib construnctor");
}
void _uninit_(void)
{
int i;
- char msg[DA_LOG_MAX];
probeBlockStart();
gTraceInfo.init_complete = -1;
- sprintf(msg, "dynamic analyzer probe helper so unloading... pid[%d]\n",
- getpid());
- PRINTMSG(msg);
+ PRINTMSG("dynamic analyzer probe helper so unloading... pid[%d]\n",
+ getpid());
remove_all_glist();
void __attribute__((destructor)) _fini_probe()
{
- char msg[DA_LOG_MAX];
- sprintf(msg, "->lib destructor. pid[%d]\n", getpid());
- PRINTMSG(msg);
+ PRINTMSG("->lib destructor. pid[%d]\n", getpid());
_uninit_();
}
// get backtrace string
// return stack depth if succeed, otherwise return 0
// parameter 'log' cannot be null
+/* TODO remove unused code (getBacktraceString)*/
int getBacktraceString(log_t* log, int bufsize)
{
void* array[MAX_STACK_DEPTH];
char** strings = NULL;
size_t i, size;
int initsize;
+ int curlen;
int stringlen;
if(log == NULL)
probeBlockStart();
initsize = log->length;
- log->data[log->length] = '\0'; // is this necessary ?
+ curlen = initsize;
+ log->data[curlen] = '\0'; // is this necessary ?
size = backtrace(array, MAX_STACK_DEPTH);
if(likely(size > TRIM_STACK_DEPTH))
{
for(i = TRIM_STACK_DEPTH; i < size; i++)
{
stringlen = strlen(strings[i - TRIM_STACK_DEPTH]) + 14;
- if(log->length + stringlen >= bufsize + initsize)
+ if(curlen + stringlen >= bufsize + initsize)
break;
- log->length += sprintf(log->data + log->length, "%010u`,%s`,", (unsigned int)(array[i]), strings[i - TRIM_STACK_DEPTH]);
+ curlen += snprintf(log->data + curlen, bufsize - curlen, "%010u`,%s`,", (unsigned int)(array[i]), strings[i - TRIM_STACK_DEPTH]);
}
- log->data[log->length-2] = '\0';
- log->length -= 2;
+ curlen -= 2;
+ log->data[curlen] = '\0';
+ log->length = curlen;
free(strings);
}
else // failed to get backtrace symbols
for(i = TRIM_STACK_DEPTH; i < size; i++)
{
stringlen = 23;
- if(log->length + stringlen >= bufsize + initsize)
+ if(curlen + stringlen >= bufsize + initsize)
break;
- log->length += sprintf(log->data + log->length, "%010u`,(unknown)`,", (unsigned int)(array[i]));
+ curlen += snprintf(log->data + curlen, bufsize - curlen, "%010u`,(unknown)`,", (unsigned int)(array[i]));
}
- log->data[log->length-2] = '\0';
- log->length -= 2;
+ curlen -= 2;
+ log->data[curlen] = '\0';
+ log->length = curlen;
}
probeBlockEnd();
#define TYPEDEF(type) typedef type
#endif
-static char contextValue[MAX_GL_CONTEXT_VALUE_SIZE];
+static char contextValue[MAX_GL_CONTEXT_VALUE_SIZE]; /* maybe it should not be gobal static variable */
static enum DaOptions _sopt = OPT_GLES;
static __thread GLenum gl_error_external = GL_NO_ERROR;
-static void __ui_array_to_str(char *to, GLuint *arr ,int count)
+static void __ui_array_to_str(char *to, GLuint *arr ,int count, size_t bufsize)
{
- int i = 0;
+ int i = 0, len = 0;
- for (i = 0; i < count; i++)
- to += sprintf(to, "%u, ", *arr++);
+ for (i = 0; i < count; i++) {
+ if (bufsize < sizeof(GLuint) * 4) {
+ PRINTERR("too small buffer.");
+ break;
+ }
+
+ len = snprintf(to, bufsize,"%u, ", *arr++);
+
+ to += len;
+ bufsize -= len;
+ }
if (count != 0) {
to -= 2;
CALL_ORIG(glDeleteTextures, n, textures);
GL_GET_ERROR();
if (error == GL_NO_ERROR)
- __ui_array_to_str(buf, (GLuint *)textures, n);
+ __ui_array_to_str(buf, (GLuint *)textures, n, sizeof(buf));
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, buf, "dp",
n, voidp_to_uint64(textures));
CALL_ORIG(glGenBuffers, n, buffers);
GL_GET_ERROR();
if (error == GL_NO_ERROR)
- __ui_array_to_str(buf, buffers, n);
+ __ui_array_to_str(buf, buffers, n, sizeof(buf));
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, buf, "dp",
n, voidp_to_uint64(buffers));
CALL_ORIG(glGenTextures, n, textures);
GL_GET_ERROR();
if (error == GL_NO_ERROR)
- __ui_array_to_str(buf, textures, n);
+ __ui_array_to_str(buf, textures, n, sizeof(buf));
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, buf, "dp",
n, voidp_to_uint64(textures));
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, "", "f", width);
}
+/* TODO refactor snprintf check*/
void REAL_NAME(glLinkProgram)(GLuint program)
{
TYPEDEF(void (*methodType)(GLuint));
char buf[512] = "";
if (error == GL_NO_ERROR) {
char *to = buf;
- int i;
+ int i, len;
+ size_t avail;
GLint activeNum[1];
GLint maxLength[1];
GLsizei length[1];
GLint size[1];
GLenum type[1];
+ avail = sizeof(buf);
+
real_glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, activeNum);
real_glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH,
maxLength);
char name1[maxLength[0]];
- to += sprintf(to, "%d", activeNum[0]);
+ len = snprintf(to, avail, "%d", activeNum[0]);
+ to += len;
+ avail -= len;
for (i = 0; i < activeNum[0]; i++) {
real_glGetActiveAttrib(program, i, maxLength[0], length,
size, type, name1);
- to += sprintf(to, ",%d,%s,%d,%x", i, name1, size[0],
- type[0]);
+ len = snprintf(to, avail, ",%d,%s,%d,%x", i, name1, size[0],
+ type[0]);
+
+ if (avail <= (unsigned int)len) {
+ PRINTERR("fatal. too small buf");
+ break;
+ }
+
+ to += len;
+ avail -= len;
}
real_glGetProgramiv(program, GL_ACTIVE_UNIFORMS, activeNum);
maxLength);
char name2[maxLength[0]];
- to += sprintf(to, ",%d", activeNum[0]);
+ len = snprintf(to, avail, ",%d", activeNum[0]);
+
+ if (avail <= (unsigned int)len) {
+ PRINTERR("fatal. too small buf");
+ } else {
+ to += len;
+ avail -= len;
+ }
+
for (i = 0; i < activeNum[0]; i++) {
real_glGetActiveUniform(program, i, maxLength[0],
length, size, type, name2);
- to += sprintf(to, ",%d,%s,%d,%x", i, name2, size[0],
- type[0]);
+ len = snprintf(to, avail, ",%d,%s,%d,%x", i, name2,
+ size[0], type[0]);
+
+ if (avail <= (unsigned int)len) {
+ PRINTERR("fatal. too small buf");
+ break;
+ }
+
+ to += len;
+ avail -= len;
+
}
}
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, buf, "d",
CALL_ORIG(glTexParameterfv, target, pname, params);
GL_GET_ERROR();
if (error == GL_NO_ERROR) {
- char param0[8];
- sprintf(param0, "%x", (GLenum)params[0]);
+ char param0[sizeof(GLenum) * 4];
+ snprintf(param0, sizeof(param0), "%x", (GLenum)params[0]);
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, param0, "xxp",
(uint64_t)(target), (uint64_t)(pname),
voidp_to_uint64(params));
CALL_ORIG(glTexParameteriv, target, pname, params);
GL_GET_ERROR();
if (error == GL_NO_ERROR) {
- char param0[8];
- sprintf(param0, "%x", (GLenum)params[0]);
+ char param0[sizeof(GLenum) * 4];
+ snprintf(param0, sizeof(param0), "%x", (GLenum)params[0]);
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, param0, "xxp",
(uint64_t)(target), (uint64_t)(pname),
voidp_to_uint64(params));
GLfloat cv[4];
real_glGetVertexAttribfv(index, GL_CURRENT_VERTEX_ATTRIB, cv);
- sprintf(contextValue, "%f,%f,%f,%f", cv[0], cv[1], cv[2], cv[3]);
+ snprintf(contextValue, sizeof(contextValue), "%f,%f,%f,%f",
+ cv[0], cv[1], cv[2], cv[3]);
GL_GET_ERROR();
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, contextValue, "df",
GLfloat cv[4];
real_glGetVertexAttribfv(index, GL_CURRENT_VERTEX_ATTRIB, cv);
- sprintf(contextValue, "%f,%f,%f,%f", cv[0], cv[1], cv[2], cv[3]);
+ snprintf(contextValue, sizeof(contextValue), "%f,%f,%f,%f",
+ cv[0], cv[1], cv[2], cv[3]);
GL_GET_ERROR();
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, contextValue, "dff",
GLfloat cv[4];
real_glGetVertexAttribfv(index, GL_CURRENT_VERTEX_ATTRIB, cv);
- sprintf(contextValue, "%f,%f,%f,%f", cv[0], cv[1], cv[2], cv[3]);
+ snprintf(contextValue, sizeof(contextValue), "%f,%f,%f,%f",
+ cv[0], cv[1], cv[2], cv[3]);
GL_GET_ERROR();
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, contextValue, "dfff",
GLfloat cv[4];
real_glGetVertexAttribfv(index, GL_CURRENT_VERTEX_ATTRIB, cv);
- sprintf(contextValue, "%f,%f,%f,%f", cv[0], cv[1], cv[2], cv[3]);
+ snprintf(contextValue, sizeof(contextValue), "%f,%f,%f,%f",
+ cv[0], cv[1], cv[2], cv[3]);
GL_GET_ERROR();
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, contextValue, "dffff",
GLfloat cv[4];
real_glGetVertexAttribfv(index, GL_CURRENT_VERTEX_ATTRIB, cv);
- sprintf(contextValue, "%f,%f,%f,%f", cv[0], cv[1], cv[2], cv[3]);
+ snprintf(contextValue, sizeof(contextValue), "%f,%f,%f,%f",
+ cv[0], cv[1], cv[2], cv[3]);
GL_GET_ERROR();
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, contextValue,
GLfloat cv[4];
real_glGetVertexAttribfv(index, GL_CURRENT_VERTEX_ATTRIB, cv);
- sprintf(contextValue, "%f,%f,%f,%f", cv[0], cv[1], cv[2], cv[3]);
+ snprintf(contextValue, sizeof(contextValue), "%f,%f,%f,%f",
+ cv[0], cv[1], cv[2], cv[3]);
GL_GET_ERROR();
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, contextValue,
GLfloat cv[4];
real_glGetVertexAttribfv(index, GL_CURRENT_VERTEX_ATTRIB, cv);
- sprintf(contextValue, "%f,%f,%f,%f", cv[0], cv[1], cv[2], cv[3]);
+ snprintf(contextValue, sizeof(contextValue), "%f,%f,%f,%f",
+ cv[0], cv[1], cv[2], cv[3]);
GL_GET_ERROR();
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, contextValue,
CALL_ORIG(glVertexAttrib4fv, index, v);
GLfloat cv[4];
real_glGetVertexAttribfv(index, GL_CURRENT_VERTEX_ATTRIB, cv);
- sprintf(contextValue, "%f,%f,%f,%f", cv[0], cv[1], cv[2], cv[3]);
+ snprintf(contextValue, sizeof(contextValue), "%f,%f,%f,%f",
+ cv[0], cv[1], cv[2], cv[3]);
GL_GET_ERROR();
AFTER('v', NO_RETURN_VALUE, APITYPE_CONTEXT, contextValue,
return (unsigned long)(ts.tv_sec * 10000 + (ts.tv_nsec/100000));
}
+/* TODO refactor close equal code in ifdef/else section */
+/* TODO remove code. it seems unused. */
#ifdef USING_BACKTRACE
int profil_backtrace_symbols(log_t *log, int bufsize, int index)
{
char **strings = NULL;
size_t i;
int initsize;
+ int curlen;
int stringlen;
if(log == NULL)
return 0;
initsize = log->length;
- log->data[log->length] = '\0'; // is this necessary ?
+ curlen = initsize;
+ log->data[curlen] = '\0'; // is this necessary ?
if(likely(sample_info_array[index].bt_size > PROFIL_TRIM_STACK_DEPTH))
{
strings = BACKTRACE_SYMBOLS(sample_info_array[index].bt_array + PROFIL_TRIM_STACK_DEPTH,
for(i = PROFIL_TRIM_STACK_DEPTH; i < sample_info_array[index].bt_size; i++)
{
stringlen = strlen(strings[i - PROFIL_TRIM_STACK_DEPTH]) + 14;
- if(log->length + stringlen >= bufsize + initsize)
+ if(curlen + stringlen >= bufsize + initsize)
break;
- log->length += sprintf(log->data + log->length, "%010u`,%s`,",
+ curlen += snprintf(log->data + curlen, bufsize - curlen, "%010u`,%s`,",
(unsigned int)(sample_info_array[index].bt_array[i]),
strings[i - PROFIL_TRIM_STACK_DEPTH]);
}
- log->data[log->length-2] = '\0';
- log->length -= 2;
+ curlen -= 2;
+ log->data[curlen] = '\0';
+ log->length = curlen;
free(strings);
}
else
for(i = PROFIL_TRIM_STACK_DEPTH; i < sample_info_array[index].bt_size; i++)
{
stringlen = 23;
- if(log->length + stringlen >= bufsize + initsize)
+ if(curlen + stringlen >= bufsize + initsize)
break;
- log->length += sprintf(log->data + log->length, "%010u`,(unknown)`,",
+ curlen += snprintf(log->data + curlen, bufsize - curlen, "%010u`,(unknown)`,",
(unsigned int)(sample_info_array[index].bt_array[i]));
}
- log->data[log->length-2] = '\0';
- log->length -= 2;
+ curlen -= 2;
+ log->data[curlen] = '\0';
+ log->length = curlen;
}
return (int)(sample_info_array[index].bt_size - PROFIL_TRIM_STACK_DEPTH);
}
char **strings = NULL;
size_t i;
int initsize;
+ int curlen;
int stringlen;
if(log == NULL)
return 0;
initsize = log->length;
- log->data[log->length] = '\0'; // is this necessary ?
+ curlen = initsize;
+ log->data[curlen] = '\0'; // is this necessary ?
strings = BACKTRACE_SYMBOLS(sample_info_array[index].bt_array,
sample_info_array[index].bt_size);
for(i = 0; i < sample_info_array[index].bt_size; i++)
{
stringlen = strlen(strings[i]) + 14;
- if(log->length + stringlen >= bufsize + initsize)
+ if(curlen + stringlen >= bufsize + initsize)
break;
- log->length += sprintf(log->data + log->length, "%010u`,%s`,",
+ curlen += snprintf(log->data + curlen, bufsize - curlen, "%010u`,%s`,",
(unsigned int)(sample_info_array[index].bt_array[i]),
strings[i]);
}
- log->data[log->length-2] = '\0';
- log->length -= 2;
+ curlen -= 2;
+ log->data[curlen] = '\0';
+ log->length = curlen;
free(strings);
}
else
for(i = 0; i < sample_info_array[index].bt_size; i++)
{
stringlen = 23;
- if(log->length + stringlen >= bufsize + initsize)
+ if(curlen + stringlen >= bufsize + initsize)
break;
- log->length += sprintf(log->data + log->length, "%010u`,(unknown)`,",
+ curlen += snprintf(log->data + curlen, bufsize - curlen, "%010u`,(unknown)`,",
(unsigned int)(sample_info_array[index].bt_array[i]));
}
- log->data[log->length-2] = '\0';
- log->length -= 2;
+ curlen -= 2;
+ log->data[curlen] = '\0';
+ log->length = curlen;
}
return (int)(sample_info_array[index].bt_size);
}