110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file daemon/opd_pipe.c 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Functions handling the $SESSIONDIR/opd_pipe FIFO special file. 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * NOTE: This code is dealing with potentially insecure input. 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2008 OProfile authors 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING 810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Daniel Hansel 1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_pipe.h" 1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_printf.h" 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_config.h" 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h> 1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h> 1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <string.h> 1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <fcntl.h> 2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <unistd.h> 2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <errno.h> 2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <sys/stat.h> 2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic int fifo; 255bbbe460405564a1aed8a67a13c43e9356ffc656Ben Chengstatic FILE * fifo_fd = NULL; 2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_create_pipe(void) 2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mode_t orig_umask = umask(0111); 3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (mkfifo(op_pipe_file, 0666) == -1) { 3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (errno != EEXIST) { 3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: couldn't create pipe: "); 3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project umask(orig_umask); 3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_open_pipe(void) 4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fifo = open(op_pipe_file, O_RDONLY | O_NONBLOCK); 4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (fifo == -1) { 4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: couldn't open pipe: "); 4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_close_pipe(void) 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 525bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng if (fifo_fd) 535bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng fclose(fifo_fd); 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project close(fifo); 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint is_jitconv_requested(void) 5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* number of dropped (unknown) requests */ 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project static long nr_drops = 0; 6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* modulus to output only a few warnings to avoid flooding oprofiled.log */ 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project static int mod_cnt_drops = 1; 6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char line[256]; 6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int i, ret = 0; 6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* get a file descriptor to the pipe */ 685bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng if (!fifo_fd) 695bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng fifo_fd = fdopen(fifo, "r"); 7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 715bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng if (fifo_fd == NULL) { 7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project perror("oprofiled: couldn't create file descriptor: "); 7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project exit(EXIT_FAILURE); 7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* read up to 99 lines to check for 'do_jitconv' */ 7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (i = 0; i < 99; i++) { 7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* just break if no new line is found */ 795bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng if (fgets(line, 256, fifo_fd) == NULL) 8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project break; 8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project line[strlen(line) - 1] = '\0'; 8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (strstr(line, "do_jitconv") != NULL) { 8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ret = 1; 8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project nr_drops++; 8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (nr_drops % mod_cnt_drops == 0) { 8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf( 9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "Warning: invalid pipe request received (dropped request(s): %ld)\n", 9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project nr_drops); 9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* increase modulus to avoid flooding log file */ 9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project mod_cnt_drops *= 5; 9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return ret; 9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 100