summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-10-18 18:51:32 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-10-18 18:51:32 +0200
commit0a3eb7d6b1ef7e9ef569dcc8e73c98a8446b52fc (patch)
tree7ca0fb0f9b05813d698d8149a4f9d96c258be035
parent3730a4df533c7508ccfa0382ad2661b0715f6487 (diff)
rio: copy window labels for menu3
as the menu is displayed, the window might go away or change its label causing menuhit() to dereference bad memory. just strdup() the labels before passing to menu3str to prevent accidents.
-rw-r--r--sys/src/cmd/rio/rio.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c
index 9c8ea3f9c..87137e483 100644
--- a/sys/src/cmd/rio/rio.c
+++ b/sys/src/cmd/rio/rio.c
@@ -709,10 +709,14 @@ button3menu(void)
}
if(n >= nelem(menu3str)-Hidden)
n = nelem(menu3str)-Hidden-1;
- for(i=0; i<n; i++)
- menu3str[i+Hidden] = hidden[i]->label;
- menu3str[i+Hidden] = nil;
-
+ for(i=0; i<n; i++){
+ free(menu3str[i+Hidden]);
+ menu3str[i+Hidden] = estrdup(hidden[i]->label);
+ }
+ for(i+=Hidden; menu3str[i]; i++){
+ free(menu3str[i]);
+ menu3str[i] = nil;
+ }
sweeping = 1;
switch(i = menuhit(3, mousectl, &menu3, wscreen)){
case -1: