Re: [Mono-list] Memory Allocation in unmanaged code
On Wed, 2004-09-08 at 17:43, Jim Fehlig wrote: > >>>Jonathan Pryor <[EMAIL PROTECTED]> 09/06/04 4:57 pm >>> > I modified the wrapper implementation to use "unsafe" code but still > unsuccessful in retrieving properties from the C# structure below. > The unmanaged ListLocalPrinters is returning a list containing 1 > element yet the loop in PrintLibWrapper.ListLocalPrinters is executed > twice, throwing a NullReferenceException when "printer = > printer->nextElement" > is executed on the second pass. Your NullReferenceException is generated because the runtime marshaller is never involved. "What!," I hear you cry. Well, we avoided it. We declared a DllImport function which takes an IntPtr, so the marshaller just blitted the pointer across, as it should. But then we go off and access the structure members /as if they were managed objects/ (the last parts the kicker, as those managed objects were never properly initialized). In other words, this is a Bad Idea: struct MyStruct {public string someStringInTheStructure;} IntPtr p = GetResource(); MyStruct* s = (MyStruct*) p; string n = s->someStringInTheStructure; `someStringInTheStructure' won't be properly marshaled as a string, as the runtime marshaler never *saw* the string, and thus didn't marshal it. Oops. Of course, I should have remembered that, but there are only some things I can pull off without testing The solution? Marshal the structure, using System.Runtime.InteropServices.Marshal.PtrToStructure(): IntPtr p = GetResource(); MyStruct s = (MyStruct) Marshal.PtrToStructure (p, typeof(MyStruct)); string n = s.someStringInTheStructure; That explains the NullReferenceException. Something else that confuses me is the behavior of `nextElement'; this doesn't work properly: IntPtr p = GetResource(); ListElement* le = (ListElement*) p; while (le != null) le = le->nextElement; If I know that GetResource() returns a linked list of 3 elements, the while loop is only executed once. I have no idea why this is, and it may be a mono bug. I'd have to test it against .NET to be sure, but that won't happen for awhile (my .NET machine isn't setup; the joy of moving...). I'm certainly open to anyone else testing this scenario under .NET and telling me what happens... (hint, hint.) The fix for the linked list? The same as the fix for the NullReferenceException: invoke the runtime marshaller directly. For your learning pleasure, I've attached two files, managed.cs and native.c. Managed.cs walks a linked list, using the InternalPrinterList structure, and native.c returns a linked list of PrinterList structures containing 3 elements. Usage: $ gcc -shared -fpic native.c -o libnative.so $ mcs -unsafe managed.cs # don't forget to set your library path to find libnative.so $ export LD_LIBRARY_PATH=`pwd` $ mono managed.exe Now I should just update my Wonder Guide (http://www.jprl.com/~jon/interop.html), and pray that my cable modem doesn't disappear again (where's fiber-to-the-home when I want it?), and all will be good. I hope. - Jon // interop struct using System; using System.Collections; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] unsafe struct InternalPrinterList { [MarshalAs(UnmanagedType.ByValTStr/*LPStr*/, SizeConst=1024)] public string printerUri; [MarshalAs(UnmanagedType.ByValTStr/*LPStr*/, SizeConst=1024)] public string printerCupsUri; [MarshalAs(UnmanagedType.ByValTStr/*LPStr*/, SizeConst=1024)] public string printerName; [MarshalAs(UnmanagedType.ByValTStr/*LPStr*/,SizeConst=81)] public string printerMakeModel; public IntPtr nextElement; } public class PrinterList { public string Uri, CupsUri, Name, MakeModel; } public unsafe class PrinterLib { // Convert linked list constructed by unmanaged code to // array of user-visible PrinterList objects. public static unsafe PrinterList[] ListLocalPrinters() { IntPtr list = IntPtr.Zero; try { ListLocalPrinters(ref list); Console.WriteLine ("ListLocalPrinters returned: {0:x}", list); ArrayList printers = new ArrayList(); IntPtr printer = list; while (printer != IntPtr.Zero) { Console.WriteLine ("printer={0:x}", printer); InternalPrinterList ipl = (InternalPrinterList) Marshal.PtrToStructure ((IntPtr) printer, typeof(InternalPrinterList)); PrinterList pl = new PrinterList(); pl.Uri = ipl.printerUri; pl.CupsUri = ipl.printerCupsUri; pl.Name = ipl.printerName; pl.MakeModel = ipl.printerMakeModel; // throws NullReferenceException Console.WriteLine("PrinterInfo: {0}, {1}", pl.Name, pl.Uri); printers.Add(pl); // Something not right here as we will
Re: [Mono-list] Security Q
On Wed, 2004-09-08 at 17:47, Joshua Tauberer wrote: > In defense of the original question, here's a real world situation I > have had to deal with: > > I am involved in commercial software that has an extremely small market, > but the software is very valuable (i.e. pricey). Thus, each purchase of > the software is very important, and it is critical that copies of the > software cannot be freely made. We use various technological techniques > to prevent unauthorized copying, in a variety of natively compiled > languages. > > However, none of these techniques would be practical under .NET, as it > would be trivial to circumvent any copy protection scheme that I know of > implemented in .NET (putting aside obfuscation). Without a copy > protection scheme, venturing into a .NET version of our software could > mean the end of new sales of the software. Well, you could always ship encrypted assemblies, decrypt the assemblies at runtime, and use Assembly.Load() on the decrypted bytes. Of course, this doesn't protect against anybody running your app inside of a debugger, trying to sniff for the decrypted assembly, but it should complicate thing significantly, assuming that you have a secure key system in place to encrypt/decrypt the assemblies. In the future, you could always rely on NGSCB/Paladium, and decrypt the assembly into protected memory, which would prevent a debugger from viewing the assembly. Alternatively, you can always write your normal libraries and use P/Invoke to wrap them for use in .NET, using your standard copy protection scheme for the unmanaged code. However, the unfortunate truth is that even highly optimized unmanaged C/C++ code is not enough to prevent copies or reverse engineering, *if* someone is willing to spend enough time/resources on breaking things. The most you can hope for is to slow things down, hopefully enough to dissuade the attacker. - Jon ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] The Mono Crisis
Hello, > Can anyone make this happen? Miguel? We agree completely with you, the Desktop team has been nice enough to have Chris Toshok work on completing the debugger. Miguel. ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Security Q
Hi, > > So, as much as I would like to be developing that software with C#, > > under our current business model it is a prohibitively risky move to do > > so. So far, a middle ground for .NET languages has seemed a theoretical > > impossibility. Nothing is impossible, though. Maybe someone has some > > ideas on how to achieve a middle ground. > > Do you target Mono or .NET? Both. > Like said before, there are some options, but any attacker can really > break your protection (in .NET or your existing platform). Right. I must have misunderstood something on the mono-project website regarding reverse engineering a MS C# product to implement it cleanly under Mono. TTFN Paul -- "Our enemies are innovative and resourceful - and so are we," "They never stop thinking about new ways to harm our country and our people - and neither do we." - George W. Bush, Aug 2004 signature.asc Description: This is a digitally signed message part
Re: [Mono-list] Security Q
Miguel de Icaza wrote: Do you target Mono or .NET? Well, right now we target neither, so either is an option. > Like said before, there are some options, but any attacker can really > break your protection (in .NET or your existing platform). Right. It's a matter of finding the right point in the effort/security/interoperability tradeoff that works for us. I don't know where that point is, though, so it's at least interesting to look at the different possibilities. -- - Joshua Tauberer http://taubz.for.net ** Nothing Unreal Exists ** ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Documentation tool
Hey, > mono browser.exe --local-edit path-to-docfiles Am wondering if we should have some menu option that says `Apply changes to local CVS copy' Maybe we could add those .xml files to CVS? > My goal was for Monodoc and Monodocer together to (eventually) be a > complete solution for documenting assemblies. It's slowly getting > there. (I'm not sure if Miguel particularly wanted that, though. :) ) I love the idea ;-) I just wish I had more time to work on monodoc. Miguel ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Documentation tool
> The only other things are the source of monodocer > (/monodoc/tools/stub.cs), and John Luke's recently written schema for > the documentation: > > http://lists.ximian.com/archives/public/mono-docs-list/2004-August/001210.html That'll keep me busy for now, thanks a great lot. * shouts * ok y'all, continue talk about mono now! -- 'May the Lord bless you and protect you. May the Lord smile on you and be gracious to you. May the Lord show you his favor and give you his peace.' 'De Heer zegent je, en Hij bewaart je. De Heer kijkt met liefde naar je, en Hij is je genadig. De Heer bedenkt het goede voor je, en geeft je vrede.' Sijmen Mulder ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Security Q
Hello, > So, as much as I would like to be developing that software with C#, > under our current business model it is a prohibitively risky move to do > so. So far, a middle ground for .NET languages has seemed a theoretical > impossibility. Nothing is impossible, though. Maybe someone has some > ideas on how to achieve a middle ground. Do you target Mono or .NET? Like said before, there are some options, but any attacker can really break your protection (in .NET or your existing platform). Miguel. ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Documentation tool
Sijmen Mulder wrote: No, the XML docs have their own format. See for example: Right. What classes should I look for? Any tutorial, besides the class documentation? The only other things are the source of monodocer (/monodoc/tools/stub.cs), and John Luke's recently written schema for the documentation: http://lists.ximian.com/archives/public/mono-docs-list/2004-August/001210.html I don't follow schemas very well myself, but it looks cool. (You might want to ask him for a copy that hasn't been mangled by the maillist archive.) As a P.S., documentation questions are best answered on mono-docs-list. I think I'm probably boring a lot of list members right now. :) -- - Joshua Tauberer http://taubz.for.net ** Nothing Unreal Exists ** ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Security Q
Jon Pryor's suggestion ("Well, you could always ship encrypted assemblies, decrypt the assemblies at runtime, and use Assembly.Load() on the decrypted bytes. ") sounds pretty good. The drawbacks seem to be 1) this would have to be done with an embedded Mono runtime, otherwise the decryption would be in managed code and 2) the assembly wouldn't be accessible for outside developers to use (i.e. it would be good if metadata was not encrypted). At least the second problem could be worked around by putting the sharable metadata into an unencrypted second assembly (abstract base classes or interfaces). No big deal there. And, maybe I'm wrong about the first problem (though of course it depends on how "secure" the assembly needs to be). In my case, the decryption key would almost definitely have to be within the executable itself, and that doesn't seem to be a good idea with managed code, at least at face value. Sijmen Mulder wrote: Just a suggestion, but you might write a small platform specific library in a native language for the copy protection part. But that would ruin the cross-platform thing, though. The copy protection part definitely needs to be in native code. A call to System.Security.Cryptography classes would be a dead giveaway to a novice programmer on where to remove a few function calls from the bytecode disassembly. But, the part that it is protecting should be written in C#. And then how do you connect the protector with the protectee? -- - Joshua Tauberer http://taubz.for.net ** Nothing Unreal Exists ** ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Documentation tool
> No, the XML docs have their own format. See for example: Right. What classes should I look for? Any tutorial, besides the class documentation? -- 'May the Lord bless you and protect you. May the Lord smile on you and be gracious to you. May the Lord show you his favor and give you his peace.' 'De Heer zegent je, en Hij bewaart je. De Heer kijkt met liefde naar je, en Hij is je genadig. De Heer bedenkt het goede voor je, en geeft je vrede.' Sijmen Mulder ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Documentation tool
But, I'm not really into the XML part of things, but does the XmlSerializer suffice for XML documentation? No, the XML docs have their own format. See for example: http://cvs.hispalinux.es/cgi-bin/cvsweb/monodoc/class/corlib/en/System/String.xml?rev=1.5&content-type=text/x-cvsweb-markup&cvsroot=mono -- - Joshua Tauberer http://taubz.for.net ** Nothing Unreal Exists ** ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Documentation tool
> But, yes, these are XML documentation files with everything but what a > human needs to fill in. So, it has all of the classes, members, etc. of > an assembly with lots of "To be written" lines ready to be replaced with > real content. They're not "empty" exactly -- they have a lot of > important content that is auto-generated, like method signatures. That's what I ment, the skeleton. Thanks! But, I'm not really into the XML part of things, but does the XmlSerializer suffice for XML documentation? -- 'May the Lord bless you and protect you. May the Lord smile on you and be gracious to you. May the Lord show you his favor and give you his peace.' 'De Heer zegent je, en Hij bewaart je. De Heer kijkt met liefde naar je, en Hij is je genadig. De Heer bedenkt het goede voor je, en geeft je vrede.' Sijmen Mulder ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Documentation tool
I've been so quiet on mono-list for a long time. I guess this is my week. Sijmen Mulder wrote: "subs", are those the empty XML doc files? Stubs generally refer to, uhm... it's one of those words that I know the meaning of but can't quickly throw out a definition. But, yes, these are XML documentation files with everything but what a human needs to fill in. So, it has all of the classes, members, etc. of an assembly with lots of "To be written" lines ready to be replaced with real content. They're not "empty" exactly -- they have a lot of important content that is auto-generated, like method signatures. -- - Joshua Tauberer http://taubz.for.net ** Nothing Unreal Exists ** ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] The Mono Crisis
On 09/09/04 Ralph Mason wrote: > It lacks a workable debugger of any kind - Yes I know there is this > method and that method that you 'can' use but they all suck. They don't > build or they need this and that, but no one can actually nail down > exactly what this and that is. Yes, we recognize it's an issue. Toshok started working a few days ago to improve the debugging situation. > We have been diligently trying to use mono for about 6 month or more and > have tried basically every permutation of debuggers, library versions, > NPTL no NPTL this kernel that kernel, this garbage collector, that one, The mono debugger is mostly unusable right now, so it's better if people don't waste time with it unless they plan to work on it. > none at all, gdb etc etc (This whole freezing up NTPL / GC problem and gdb works for me (you need version 6.0 or 6.2 to handle therads, earlier versions didn't support them very well). Of course, using it with managed code is a bit of a pain unless you're interested in the jit code produced:-) There are a couple of helper functions, like print_method_from_ip() to move around: we definitely need to add more, like a describe_object() or describe_locals() helper. > the way that the problem is not recognized as a problem is the second > largest problem I have with mono) Is this the issue on gentoo? People seem to have tracked down an issue between libgc and nptl, but it doesn't look they have reported it to either the nptl or the libgc developers: we could do it, but it would be better if it's done by someone who can actually reproduce the issue since he could give details. > Mono Needs a STABLE debugger that will build and run on ANY system. The > debugger needs to be able to step into interop libraries (or have some > way to debug both at once); I agree completely. > Can anyone make this happen? Miguel? As said, Toshok started to work a few days ago on this very issue. Thanks. lupus -- - [EMAIL PROTECTED] debian/rules [EMAIL PROTECTED] Monkeys do it better ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Security Q
> So, as much as I would like to be developing that software with C#, > under our current business model it is a prohibitively risky move to do > so. So far, a middle ground for .NET languages has seemed a theoretical > impossibility. Nothing is impossible, though. Maybe someone has some > ideas on how to achieve a middle ground. Just a suggestion, but you might write a small platform specific library in a native language for the copy protection part. But that would ruin the cross-platform thing, though. -- 'May the Lord bless you and protect you. May the Lord smile on you and be gracious to you. May the Lord show you his favor and give you his peace.' 'De Heer zegent je, en Hij bewaart je. De Heer kijkt met liefde naar je, en Hij is je genadig. De Heer bedenkt het goede voor je, en geeft je vrede.' Sijmen Mulder ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] Documentation tool
Hi, > > Till now I've used assembler.exe to generate the stubs based on assembly > > reflection... Does Monodocer replace it? > > That's the goal... whether monodocer is stable enough to replace the > old tools is another question, but I would urge people to try monodocer. "subs", are those the empty XML doc files? -- 'May the Lord bless you and protect you. May the Lord smile on you and be gracious to you. May the Lord show you his favor and give you his peace.' 'De Heer zegent je, en Hij bewaart je. De Heer kijkt met liefde naar je, en Hij is je genadig. De Heer bedenkt het goede voor je, en geeft je vrede.' Sijmen Mulder" ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
RE: [Mono-list] System.Resources.ResourceManager and Mono Class status page
Aah ok thanks! So the page http://mono.ximian.com/class-status/1.0/ seems to be really up-to-date, but ... I cannot find GUID? Thanks for the link to the CVS! -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Juan Cristóbal Olivares Sent: Donnerstag, 09. September 2004 17:16 To: Barbara Plank; [EMAIL PROTECTED] Subject: Re: [Mono-list] System.Resources.ResourceManager and Mono Class status page The System.Resources namespace is part of the corlib library, not the System.dll. You can see it on the CVS: http://cvs.hispalinux.es/cgi-bin/cvsweb/mcs/class/corlib/System.Resources/?c vsroot=mono :) Juan C. Olivares - Original Message - From: "Barbara Plank" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Thursday, September 09, 2004 11:05 AM Subject: [Mono-list] System.Resources.ResourceManager and Mono Class status page > Hi Mono Team, > > I have a web application which uses the System.Resources.ResourceManager to > read string values from an resx file. > I tried it on Win XP with IIS and it worked fine. Then I wanted to know if > this works also on Mono... So my first idea was to check the class status > page (see http://mono.ximian.com/class-status/1.0/class-status-System.html ) > > - but unfortunately I had some problems with this page: > > First of all, I could not find the System.Resources namespace.?! > > Secondly, another time I was searching System.GUID, it was also missing on > this page Gonzalo was saying that it might be a bug... so, my question: > > Is there another link/page where I can find the Up-to-date class status? > OR > WHERE can I get true information about the class status? > OR > Are this two namespaces just links missing on this page and do I have the > actual class status page? > OR > Is it a bug?! > > I tried the web application which uses the ResourceManager, copied the whole > application on linux/apache/mod_mono but it did behave differently from IIS. > So I don't know if it is my error somewhere or if Mono has not yet > implemented the ResourceManger or, or, or ... > > I tried also the other web application which uses System.GUID and that > worked great. So I know that System.GUID is implemented and working also on > Mono, even if I cannot find it on the class status page. > > Anyway, I find that Mono is great and it will have a big future. > Just a little bit more up-to-date information would greatly be appreciated. > Because often I have no idea if things are already implemented in Mono... > because I cannot find them on the class status page...like this case with > System.GUID or System.Resources.ResourceManager. > > Does anybody else having the same experiences? > > Thanks a lot, > I'm very glad for any hint/info/advice :) > Barbara > > > > ___ > Mono-list maillist - [EMAIL PROTECTED] > http://lists.ximian.com/mailman/listinfo/mono-list ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
Re: [Mono-list] System.Resources.ResourceManager and Mono Class status page
The System.Resources namespace is part of the corlib library, not the System.dll. You can see it on the CVS: http://cvs.hispalinux.es/cgi-bin/cvsweb/mcs/class/corlib/System.Resources/?cvsroot=mono :) Juan C. Olivares - Original Message - From: "Barbara Plank" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Thursday, September 09, 2004 11:05 AM Subject: [Mono-list] System.Resources.ResourceManager and Mono Class status page > Hi Mono Team, > > I have a web application which uses the System.Resources.ResourceManager to > read string values from an resx file. > I tried it on Win XP with IIS and it worked fine. Then I wanted to know if > this works also on Mono... So my first idea was to check the class status > page (see http://mono.ximian.com/class-status/1.0/class-status-System.html ) > > - but unfortunately I had some problems with this page: > > First of all, I could not find the System.Resources namespace.?! > > Secondly, another time I was searching System.GUID, it was also missing on > this page Gonzalo was saying that it might be a bug... so, my question: > > Is there another link/page where I can find the Up-to-date class status? > OR > WHERE can I get true information about the class status? > OR > Are this two namespaces just links missing on this page and do I have the > actual class status page? > OR > Is it a bug?! > > I tried the web application which uses the ResourceManager, copied the whole > application on linux/apache/mod_mono but it did behave differently from IIS. > So I don't know if it is my error somewhere or if Mono has not yet > implemented the ResourceManger or, or, or ... > > I tried also the other web application which uses System.GUID and that > worked great. So I know that System.GUID is implemented and working also on > Mono, even if I cannot find it on the class status page. > > Anyway, I find that Mono is great and it will have a big future. > Just a little bit more up-to-date information would greatly be appreciated. > Because often I have no idea if things are already implemented in Mono... > because I cannot find them on the class status page...like this case with > System.GUID or System.Resources.ResourceManager. > > Does anybody else having the same experiences? > > Thanks a lot, > I'm very glad for any hint/info/advice :) > Barbara > > > > ___ > Mono-list maillist - [EMAIL PROTECTED] > http://lists.ximian.com/mailman/listinfo/mono-list ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
[Mono-list] System.Resources.ResourceManager and Mono Class status page
Hi Mono Team, I have a web application which uses the System.Resources.ResourceManager to read string values from an resx file. I tried it on Win XP with IIS and it worked fine. Then I wanted to know if this works also on Mono... So my first idea was to check the class status page (see http://mono.ximian.com/class-status/1.0/class-status-System.html ) - but unfortunately I had some problems with this page: First of all, I could not find the System.Resources namespace.?! Secondly, another time I was searching System.GUID, it was also missing on this page Gonzalo was saying that it might be a bug... so, my question: Is there another link/page where I can find the Up-to-date class status? OR WHERE can I get true information about the class status? OR Are this two namespaces just links missing on this page and do I have the actual class status page? OR Is it a bug?! I tried the web application which uses the ResourceManager, copied the whole application on linux/apache/mod_mono but it did behave differently from IIS. So I don't know if it is my error somewhere or if Mono has not yet implemented the ResourceManger or, or, or ... I tried also the other web application which uses System.GUID and that worked great. So I know that System.GUID is implemented and working also on Mono, even if I cannot find it on the class status page. Anyway, I find that Mono is great and it will have a big future. Just a little bit more up-to-date information would greatly be appreciated. Because often I have no idea if things are already implemented in Mono... because I cannot find them on the class status page...like this case with System.GUID or System.Resources.ResourceManager. Does anybody else having the same experiences? Thanks a lot, I'm very glad for any hint/info/advice :) Barbara ___ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list